diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e18faf5..7c726eb 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -32,6 +32,7 @@ "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", + "json-schema-to-typescript": "^15.0.4", "tw-animate-css": "^1.3.4", "typescript": "~5.8.3", "typescript-eslint": "^8.30.1", @@ -51,6 +52,24 @@ "node": ">=6.0.0" } }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.9.3", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz", + "integrity": "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -1026,6 +1045,13 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true, + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2087,6 +2113,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/lodash": { + "version": "4.17.18", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.18.tgz", + "integrity": "sha512-KJ65INaxqxmU6EoCiJmRPZC9H9RVWCRd349tXM2M3O5NA7cY6YL7c0bHAHQ93NOfTObEQ004kd2QVHs/r0+m4g==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "24.0.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", @@ -3288,6 +3321,30 @@ "dev": true, "license": "MIT" }, + "node_modules/json-schema-to-typescript": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz", + "integrity": "sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^11.5.5", + "@types/json-schema": "^7.0.15", + "@types/lodash": "^4.17.7", + "is-glob": "^4.0.3", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "prettier": "^3.2.5", + "tinyglobby": "^0.2.9" + }, + "bin": { + "json2ts": "dist/src/cli.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -3583,6 +3640,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -3655,6 +3719,16 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -3870,6 +3944,22 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index cb75a11..affe929 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -34,6 +34,7 @@ "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", + "json-schema-to-typescript": "^15.0.4", "tw-animate-css": "^1.3.4", "typescript": "~5.8.3", "typescript-eslint": "^8.30.1", diff --git a/frontend/public/data/reproinventory_data.json b/frontend/public/data/reproinventory_data.json new file mode 100644 index 0000000..9a9c4d2 --- /dev/null +++ b/frontend/public/data/reproinventory_data.json @@ -0,0 +1,2080 @@ +[ + { + "id": 1, + "tag_team": [ + "CW", + "BH", + "JB" + ], + "course_name": "Git course", + "url": "https://git-course.netlify.app/", + "level": [ + "Beginner" + ], + "platform": [ + "Mac" + ], + "keywords": [ + "Git", + "Version Control", + "GitHub" + ], + "course_length": "1-4 hrs", + "instruction_medium": [ + "Hands-on tutorial / notebooks", + "website" + ], + "delivery": [ + "self-paced", + "instructor" + ], + "language": [ + "English" + ], + "programming_language": [ + "Git" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2023", + "functionality": null, + "assessment": false, + "prerequisite": null, + "source": [ + "ReproNim", + "Johanna Bayer", + "Fellow-22" + ], + "review": null, + "alias_links": null, + "notes": null, + "quadrants": [ + "problem-oriented (how to guides)", + "learning-oriented (tutorials)" + ] + }, + { + "id": 5, + "tag_team": [ + "CW", + "JB" + ], + "course_name": "Data Science in Communication: Python and Reproducible Research", + "url": "GitHub - yibeichan/COMM160DS: COMM 160DS: Data Science in Communication: Python and Reproducible Research (Spring 2023, University of California, Santa Barbara)", + "level": [ + "Beginner" + ], + "platform": [ + "Jupyter" + ], + "keywords": [ + "Python", + "NLP", + "Open Science", + "Reproducibility", + "Data Science", + "Pandas", + "Seaborn", + "Publish", + "Statistics" + ], + "course_length": "1+ weeks", + "instruction_medium": [ + "Hands-on tutorial / notebooks", + "lecture" + ], + "delivery": [ + "self-paced", + "instructor" + ], + "language": [ + "English" + ], + "programming_language": [ + "Python" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2023", + "functionality": null, + "assessment": true, + "prerequisite": null, + "source": [ + "ReproNim", + "Yibei Chen", + "Fellow-22", + "UCSB" + ], + "review": "JupyterHub no longer accessible. Need to link GitHubClassroom to GitHub (uclear if links work once you do that)", + "alias_links": null, + "notes": null, + "quadrants": [ + "learning-oriented (tutorials)" + ] + }, + { + "id": 7, + "tag_team": [ + "MH", + "CF", + "JB" + ], + "course_name": "Reproducible Data Management with DataLad - University of Munster 18/11/22", + "url": "https://onedrive.live.com/?authkey=%21AFsNiGzveqZ750s&id=86184EF59C004002%21416672&cid=86184EF59C004002&parId=root&parQt=sharedby&o=OneUp", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "Datalad", + "Version Control", + "Collect" + ], + "course_length": "<1 hr", + "instruction_medium": [ + "slides", + "lecture" + ], + "delivery": [ + "instructor" + ], + "language": [ + "English" + ], + "programming_language": [ + "Git" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2022", + "functionality": null, + "assessment": false, + "prerequisite": null, + "source": [ + "ReproNim", + "Julian Kosciessa", + "Fellow-22", + "Donders Institute" + ], + "review": "Short slide deck, very clear", + "alias_links": null, + "notes": "link does not work for me (JB) can someone double check", + "quadrants": [ + "understanding-oriented (explanation)" + ] + }, + { + "id": 8, + "tag_team": [ + "CW", + "CF" + ], + "course_name": "Reproducible Data Management with DataLad - MEG/EEG Meeting DCCN 2022-11-28", + "url": "https://onedrive.live.com/?authkey=%21AANsp4ZosaSOK2o&id=86184EF59C004002%21416988&cid=86184EF59C004002&parId=root&parQt=sharedby&o=OneUp", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "Datalad", + "Version Control", + "FAIR", + "Collect" + ], + "course_length": "<1 hr", + "instruction_medium": [ + "lecture", + "slides" + ], + "delivery": [ + "self-paced" + ], + "language": [ + "English" + ], + "programming_language": [ + "NA" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2022", + "functionality": null, + "assessment": false, + "prerequisite": [ + "Basic Git" + ], + "source": [ + "ReproNim", + "Julian Kosciessa", + "Fellow-22", + "Donders Institute" + ], + "review": "Relatively quick overview - more just what is DataLad vs detailed how to use", + "alias_links": null, + "notes": null, + "quadrants": [ + "information-oriented (reference)", + "understanding-oriented (explanation)" + ] + }, + { + "id": 9, + "tag_team": [ + "CW", + "CF", + "JB" + ], + "course_name": "Reusable (big) data management with DataLad - Donders Nexus", + "url": "https://1drv.ms/b/s!AgJAAJz1ThiGms0Vdo-WifbI8FKPOA?e%3DourGa2&sa=D&source=editors&ust=1718948936539613&usg=AOvVaw0nBhMBkdri9NRmpgP0Wfu1", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "Datalad", + "Version Control", + "FAIR", + "Collect" + ], + "course_length": "<1 hr", + "instruction_medium": [ + "lecture", + "slides" + ], + "delivery": [ + "self-paced" + ], + "language": [ + "English" + ], + "programming_language": [ + "NA" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2022", + "functionality": null, + "assessment": false, + "prerequisite": null, + "source": [ + "ReproNim", + "Julian Kosciessa", + "Fellow-22", + "Donders Institute" + ], + "review": "Very short slide deck on GIT", + "alias_links": null, + "notes": null, + "quadrants": [ + "understanding-oriented (explanation)", + "information-oriented (reference)" + ] + }, + { + "id": 10, + "tag_team": [ + "BH", + "CF" + ], + "course_name": "Git Workshop", + "url": "https://1drv.ms/b/s!AgJAAJz1ThiGms0Z1FcP8964X7sAxw?e=ZpBDCi", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "Git", + "Shell", + "Version Control" + ], + "course_length": "<1 hr", + "instruction_medium": [ + "lecture", + "slides" + ], + "delivery": [ + "self-paced" + ], + "language": [ + "English" + ], + "programming_language": [ + "Git" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2023", + "functionality": null, + "assessment": false, + "prerequisite": null, + "source": [ + "ReproNim", + "Julian Kosciessa", + "Fellow-22", + "Donders Institute" + ], + "review": "Practical intro to bash and git", + "alias_links": null, + "notes": null, + "quadrants": [ + "understanding-oriented (explanation)" + ] + }, + { + "id": 11, + "tag_team": [ + "CW", + "CF", + "JB" + ], + "course_name": "ISMRM QC 2022", + "url": "https://www.nipreps.org/qc-book/welcome.html", + "level": [ + "Intermediate", + "Beginner", + "Advanced" + ], + "platform": [ + "Jupyter" + ], + "keywords": [ + "Nipreps", + "QC", + "QA", + "MRIQC", + "IQMs", + "Image Process", + "Standards", + "Describe" + ], + "course_length": "1-3 days", + "instruction_medium": [ + "website", + "Hands-on tutorial / notebooks" + ], + "delivery": [ + "self-paced" + ], + "language": [ + "English" + ], + "programming_language": [ + "Python", + "Git", + "shell scripting" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "MRI" + ], + "open_dataset": "NA", + "last_updated": "2022", + "functionality": null, + "assessment": true, + "prerequisite": [ + "MRI preprocessing", + "R", + "Python" + ], + "source": [ + "ReproNim", + "Celine Provins", + "Fellow-22" + ], + "review": "Focuses on QC in reference to MRIQC; has lots of big picture info about QC/QA in general", + "alias_links": null, + "notes": null, + "quadrants": [ + "learning-oriented (tutorials)" + ] + }, + { + "id": 16, + "tag_team": [ + "CW", + "CF" + ], + "course_name": "Reproducible Computation Environments", + "url": "https://uicapture.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=0640440b-c7ab-46c7-9bca-afdc00f914e6", + "level": [ + "Beginner" + ], + "platform": [ + "Docker" + ], + "keywords": [ + "Docker", + "Image Processing", + "Reproducible Environments" + ], + "course_length": "<1 hr", + "instruction_medium": [ + "video", + "lecture" + ], + "delivery": [ + "self-paced" + ], + "language": [ + "English" + ], + "programming_language": [ + "shell scripting" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2022", + "functionality": null, + "assessment": false, + "prerequisite": [ + "Shell scripting" + ], + "source": [ + "ReproNim", + "Avery Van De Water", + "Fellow-22" + ], + "review": "labeled as part 1 - unclear where part 2 is", + "alias_links": null, + "notes": null, + "quadrants": [ + "learning-oriented (tutorials)" + ] + }, + { + "id": 18, + "tag_team": [ + "BH", + "DNK" + ], + "course_name": "Guide to reproducible neuroimaging research", + "url": "https://github.com/compneuro-ncu/reproducible-neuroimaging", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "Pre-registration", + "Plan", + "Version Control" + ], + "course_length": "1-3 days", + "instruction_medium": [ + "notes", + "website", + "outline" + ], + "delivery": [ + "self-paced" + ], + "language": [ + "English" + ], + "programming_language": [ + "NA" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2021", + "functionality": "NA", + "assessment": false, + "prerequisite": null, + "source": [ + "ReproNim", + "Karolina Finc" + ], + "review": "Some sections are under-developed", + "alias_links": null, + "notes": "Reproducible Neuroimaging, tutorial guide, for cog sci students audience", + "quadrants": null + }, + { + "id": 21, + "tag_team": [ + "CW" + ], + "course_name": "Carpentries Incubator- SDC-BIDS-IntroMRI", + "url": "https://carpentries-incubator.github.io/SDC-BIDS-IntroMRI/before-we-start.html", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "BIDS", + "DataLad", + "Python", + "Neuroimaging", + "Carpentries", + "Standards", + "Version Control", + "Image Process", + "Statistics" + ], + "course_length": "1 day", + "instruction_medium": [ + "Hands-on tutorial / notebooks" + ], + "delivery": [ + "self-paced" + ], + "language": [ + "English" + ], + "programming_language": [ + "Python" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "MRI" + ], + "open_dataset": "True", + "last_updated": "2024", + "functionality": null, + "assessment": true, + "prerequisite": [ + "Unix", + "Basic Python" + ], + "source": [ + "ReproNim", + "MIchael Joseph", + "Fellow-20" + ], + "review": "Basic Imaging Overview. Focus on BIDS", + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 22, + "tag_team": [ + "CW", + "JB" + ], + "course_name": "Carpentries Incubator-SDC-BIDS-functional MRI", + "url": "https://carpentries-incubator.github.io/SDC-BIDS-fMRI/", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "nilearn", + "resting state", + "preprocessing", + "Python", + "resting state", + "carpentries", + "Image Process", + "Statistics" + ], + "course_length": "1 day", + "instruction_medium": [ + "Hands-on tutorial / notebooks", + "website" + ], + "delivery": [ + "self-paced" + ], + "language": [ + "English" + ], + "programming_language": [ + "Python" + ], + "neuroimaging_software": [ + "Python" + ], + "imaging_modality": [ + "Functional" + ], + "open_dataset": "True", + "last_updated": "2024", + "functionality": null, + "assessment": true, + "prerequisite": [ + "Python" + ], + "source": [ + "ReproNim", + "MIchael Joseph", + "Fellow-20" + ], + "review": "Tutorial on functional neuroimaging in Python", + "alias_links": null, + "notes": null, + "quadrants": [ + "learning-oriented (tutorials)", + "problem-oriented (how to guides)" + ] + }, + { + "id": 23, + "tag_team": [ + "CW" + ], + "course_name": "Carpentries Incubator - SDC-BIDS-diffusion MRI", + "url": "https://carpentries-incubator.github.io/SDC-BIDS-dMRI/introduction.html", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "dMRI", + "carpentries", + "preprocessing", + "Image Process", + "Statistics" + ], + "course_length": "1 day", + "instruction_medium": [ + "Hands-on tutorial / notebooks" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": [ + "Python" + ], + "neuroimaging_software": [ + "Python" + ], + "imaging_modality": [ + "DWI" + ], + "open_dataset": "True", + "last_updated": "2024", + "functionality": null, + "assessment": true, + "prerequisite": [ + "Unix", + "Basic Python" + ], + "source": [ + "ReproNim", + "MIchael Joseph", + "Fellow-20" + ], + "review": null, + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 25, + "tag_team": [ + "CW" + ], + "course_name": "Reproducibility science and methodologies (approx)", + "url": "https://docs.google.com/document/d/1VBMtoBSuviYTDY5AdaoqIFBrHlBt6NmBToDVGkTexG4/edit#heading=h.g63wsqcq2bbh", + "level": [ + "Beginner" + ], + "platform": [ + "Docker" + ], + "keywords": [ + "syllabus", + "MRI", + "BIDS", + "preprocessing", + "fMRIprep", + "Plan", + "Standards" + ], + "course_length": "1 week", + "instruction_medium": [ + "notes" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": [ + "Python" + ], + "neuroimaging_software": [ + "Multiple" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2020", + "functionality": null, + "assessment": false, + "prerequisite": [ + "Unix", + "Basic Python" + ], + "source": [ + "ReproNim", + "Jennifer Legault", + "Fellow-20" + ], + "review": "example syllabus for hackathon/course", + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 26, + "tag_team": [ + "ELB" + ], + "course_name": "ReproRehab: Reproducible Rehabilitation Research Education Program", + "url": "https://www.reprorehab.usc.edu/course", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "Rehabilitation", + "data sharing", + "DataLad" + ], + "course_length": "1+ weeks", + "instruction_medium": [ + "video" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": null, + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2023", + "functionality": null, + "assessment": false, + "prerequisite": null, + "source": [ + "ReproNim", + "Sook-Lei Liew", + "Fellow-20", + "ReproRehab" + ], + "review": "Entire first year bootcamp videos online", + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 28, + "tag_team": [ + "ELB" + ], + "course_name": "BrainIAK", + "url": "https://brainiak.org/tutorials/", + "level": [ + "Beginner" + ], + "platform": [ + "Jupyter" + ], + "keywords": [ + "Python", + "fMRI", + "multivariate analysis" + ], + "course_length": "1+ weeks", + "instruction_medium": [ + "Hands-on tutorial / notebooks" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": [ + "Python" + ], + "neuroimaging_software": [ + "Python" + ], + "imaging_modality": [ + "Functional" + ], + "open_dataset": "NA", + "last_updated": "2020", + "functionality": null, + "assessment": false, + "prerequisite": [ + "basic programming" + ], + "source": [ + "ReproNim", + "Elizabeth McDevitt", + "Fellow-20", + "Princeton" + ], + "review": "Jupyter tutorials from the basics to advanced machine learning analyses on fMRI data", + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 29, + "tag_team": [ + "ELB" + ], + "course_name": "Image to Inference", + "url": "https://crnl.readthedocs.io/psyc589888/#overlay-context=", + "level": [ + "Intermediate" + ], + "platform": [ + "NA" + ], + "keywords": [ + "Syllabus", + "MRI", + "FSL" + ], + "course_length": "1+ weeks", + "instruction_medium": [ + "lecture" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": null, + "neuroimaging_software": [ + "Multiple" + ], + "imaging_modality": [ + "Functional" + ], + "open_dataset": "NA", + "last_updated": "2020", + "functionality": null, + "assessment": true, + "prerequisite": null, + "source": [ + "ReproNim", + "Chris Rorden", + "Fellow-20" + ], + "review": "Syllabus for course on fMRI, including slides, from collection to inferencing", + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 30, + "tag_team": [ + "ELB" + ], + "course_name": "Syllabus- Workshop/tutorial series in reproducibility", + "url": "https://docs.google.com/document/d/1I4U9E_5fvJ2BSSAux_PPQvr6QavR6g1burSyIACXuKI/edit#heading=h.qm1rn5lf4l02", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "BIDS", + "fMRI", + "version control" + ], + "course_length": "1+ weeks", + "instruction_medium": [ + "lecture" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": null, + "neuroimaging_software": [ + "Multiple" + ], + "imaging_modality": [ + "Functional" + ], + "open_dataset": "NA", + "last_updated": "NA", + "functionality": null, + "assessment": true, + "prerequisite": [ + "moderate programming experience", + "must have bash/unix shell experience" + ], + "source": [ + "ReproNim", + "Julie Schneider", + "Fellow-20" + ], + "review": "Syllabus for reproducible neuroimaging multi-week course", + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 31, + "tag_team": [ + "CW" + ], + "course_name": "Reproducibility Tutorial Notes", + "url": "https://docs.google.com/document/d/1JAz10xCdWw2ifOzcV-KQhmqz9Vq7PCF1CBq868aaXvQ/edit", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "syllabus", + "BIDS", + "version control", + "QA" + ], + "course_length": "1-3 days", + "instruction_medium": [ + "notes" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": [ + "NA" + ], + "neuroimaging_software": [ + "Freesurfer" + ], + "imaging_modality": [ + "MRI" + ], + "open_dataset": "NA", + "last_updated": "2020", + "functionality": null, + "assessment": false, + "prerequisite": [ + "UNIX", + "Basic Python" + ], + "source": [ + "ReproNim" + ], + "review": "syllabus for tutorial; details unclear. Might be unfinished.", + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 32, + "tag_team": [ + "CW", + "JB" + ], + "course_name": "DataLad Handbook", + "url": "https://handbook.datalad.org/en/latest/", + "level": [ + "Intermediate" + ], + "platform": [ + "NA" + ], + "keywords": [ + "DataLad", + "version control", + "Collect" + ], + "course_length": "1-3 days", + "instruction_medium": [ + "reference", + "website" + ], + "delivery": [ + "self-paced" + ], + "language": [ + "English" + ], + "programming_language": [ + "shell scripting" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2024", + "functionality": "2025", + "assessment": false, + "prerequisite": [ + "DataLad Handbook. Has Beginner and Advanced use cases" + ], + "source": [ + "ReproNim", + "Adina Wagner" + ], + "review": "very good resource for data provenance", + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 33, + "tag_team": [ + "CF", + "SS", + "JB" + ], + "course_name": "AI campus", + "url": "https://ki-campus.org/", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "AI", + "chatbots" + ], + "course_length": "1+ weeks", + "instruction_medium": [ + "video" + ], + "delivery": null, + "language": [ + "English", + "German" + ], + "programming_language": [ + "NA" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2024", + "functionality": null, + "assessment": false, + "prerequisite": null, + "source": [ + "AI campus" + ], + "review": "Nice videos and course material on AI", + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 34, + "tag_team": [ + "CF", + "SS", + "JB" + ], + "course_name": "Research Data Management 01", + "url": "https://www.youtube.com/watch?v=fL3DWzSWFL8", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "Datalad", + "Version Control", + "Collect" + ], + "course_length": "1-4 hrs", + "instruction_medium": [ + "video" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": [ + "shell scripting" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2021", + "functionality": null, + "assessment": false, + "prerequisite": null, + "source": [ + "ReproNim", + "Lennart Wittkuhn", + "Adina Wagner" + ], + "review": "Good video", + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 35, + "tag_team": [ + "MH" + ], + "course_name": "Data collection to paper-Git basics, Data Management", + "url": "https://github.com/adswa/mpi-datamanagement-ws", + "level": [ + "Intermediate" + ], + "platform": [ + "NA" + ], + "keywords": [ + "Datalad", + "MPI", + "Version Control" + ], + "course_length": "1 day", + "instruction_medium": [ + "outline" + ], + "delivery": [ + "self-paced" + ], + "language": [ + "English" + ], + "programming_language": [ + "shell scripting" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2020", + "functionality": null, + "assessment": false, + "prerequisite": null, + "source": null, + "review": "Course outline for Data Lad Course", + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 36, + "tag_team": [ + "CF", + "SS", + "JB" + ], + "course_name": "Version Control", + "url": "https://lennartwittkuhn.com/version-control-book/", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "Git", + "Version Control" + ], + "course_length": "1+ weeks", + "instruction_medium": [ + "notes" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": [ + "Git" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2024", + "functionality": null, + "assessment": false, + "prerequisite": null, + "source": [ + "ReproNim", + "Lennart Wittkuhn" + ], + "review": null, + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 38, + "tag_team": [ + "CF", + "SS", + "JB" + ], + "course_name": "Data Science Basics in Neuroscience", + "url": "https://wcm-datascibasics.github.io/", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "Git", + "Reproducibility", + "Containers", + "Image Process", + "Version Control" + ], + "course_length": "1+ weeks", + "instruction_medium": [ + "lecture" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": null, + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2021", + "functionality": null, + "assessment": false, + "prerequisite": null, + "source": [ + "ReproNim", + "Xihe Xie" + ], + "review": "Review of previous materials, full course", + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 39, + "tag_team": [ + "CW", + "JB" + ], + "course_name": "ReproNim Workshop Schedule", + "url": "https://github.com/mick-d/repronim-fcbg", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "Syllabus", + "shell scripting", + "version control", + "Python", + "FAIR", + "statistics", + "Machine Learning" + ], + "course_length": "1-3 days", + "instruction_medium": [ + "notes" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": [ + "Python" + ], + "neuroimaging_software": [ + "Python" + ], + "imaging_modality": [ + "MRI" + ], + "open_dataset": "NA", + "last_updated": "2019", + "functionality": null, + "assessment": false, + "prerequisite": null, + "source": [ + "ReproNim", + "Michael Dayan", + "Fellow-19" + ], + "review": "Syllabus for ReproNim workshop", + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 40, + "tag_team": [ + "CW", + "JB" + ], + "course_name": "Syllabus - Research Imaging Informatics", + "url": "https://docs.google.com/document/d/1J-wCg62yIJNCdZd_bTDYkOWCXn0eqD1j7l17MQlE4qM/edit", + "level": [ + "Intermediate" + ], + "platform": [ + "NA" + ], + "keywords": [ + "Syllabus", + "FAIR" + ], + "course_length": "1+ weeks", + "instruction_medium": [ + "notes", + "outline" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": [ + "NA" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "MRI" + ], + "open_dataset": "NA", + "last_updated": "2019", + "functionality": null, + "assessment": false, + "prerequisite": [ + "Computational Methods", + "Neuroimaging experience" + ], + "source": [ + "ReproNim", + "Aaron Kemp", + "Fellow-19" + ], + "review": "Syllabus for Research Imaging Informatics course. Overview of neuroimaging methods and basic processing", + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 43, + "tag_team": [ + "CF", + "SS", + "JB" + ], + "course_name": "Managing Reproducible Expts with DataLad and Boutiques", + "url": "https://github.com/gkiar/Repronim-GSAN", + "level": [ + "Intermediate" + ], + "platform": [ + "NA" + ], + "keywords": [ + "DataLad", + "Boutiques", + "Collect" + ], + "course_length": "1-3 days", + "instruction_medium": [ + "Hands-on tutorial / notebooks" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": [ + "Python" + ], + "neuroimaging_software": [ + "Python" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2020", + "functionality": null, + "assessment": true, + "prerequisite": null, + "source": [ + "ReproNim" + ], + "review": "Syllabus for workshop that has been given", + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 46, + "tag_team": [ + "CF", + "SS", + "JB" + ], + "course_name": "The Princeton Handbook for Reproducible Neuroimaging\u00b6", + "url": "https://brainhack-princeton.github.io/handbook/", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "fMRI", + "Multivariate analysis" + ], + "course_length": "1+ weeks", + "instruction_medium": [ + "lecture" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": null, + "neuroimaging_software": [ + "Multiple" + ], + "imaging_modality": [ + "Functional" + ], + "open_dataset": "NA", + "last_updated": "2021", + "functionality": null, + "assessment": false, + "prerequisite": null, + "source": [ + "ReproNim", + "Princeton" + ], + "review": "Very nice overview of different fMRI topics", + "alias_links": null, + "notes": null, + "quadrants": [ + "information-oriented (reference)" + ] + }, + { + "id": 47, + "tag_team": [ + "CF", + "SS", + "JB" + ], + "course_name": "syllabus overview: MRI Analysis & ReproNim Reproducibility Imaging", + "url": "https://eroesch.github.io/2019-20-PYM0FM/", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "fMRI analysis", + "clinical", + "language science" + ], + "course_length": "1 week", + "instruction_medium": [ + "lecture" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": [ + "NA" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "Functional" + ], + "open_dataset": "NA", + "last_updated": "2019", + "functionality": null, + "assessment": false, + "prerequisite": null, + "source": [ + "ReproNim", + "Etienne Roesch" + ], + "review": "Pretty good if you want to teach fMRI analysis from scratch", + "alias_links": null, + "notes": null, + "quadrants": [ + "learning-oriented (tutorials)", + "understanding-oriented (explanation)", + "information-oriented (reference)" + ] + }, + { + "id": 51, + "tag_team": [ + "CF", + "SS", + "JB" + ], + "course_name": "Intro to Open and Reproducible Science in Computational Brain Imaging", + "url": "https://github.com/sebastientourbier/openneuroresources/blob/master/lectures/reproducibility_trabit19.pdf", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "Git", + "BIDS", + "Version control" + ], + "course_length": "1-4 hrs", + "instruction_medium": [ + "lecture" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": [ + "NA" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2019", + "functionality": null, + "assessment": false, + "prerequisite": null, + "source": [ + "ReproNim", + "Sebastien Tourbier" + ], + "review": "Single presentation, good for an intro class to data management and data version control", + "alias_links": null, + "notes": null, + "quadrants": [ + "information-oriented (reference)", + "understanding-oriented (explanation)" + ] + }, + { + "id": 51, + "tag_team": [ + "CF", + "SS", + "JB" + ], + "course_name": "Software carpentry introduction", + "url": "https://swcarpentry.github.io/shell-novice/", + "level": [ + "Beginner" + ], + "platform": [ + "Linux" + ], + "keywords": [ + "Carpentry" + ], + "course_length": "1+ weeks", + "instruction_medium": [ + "Hands-on tutorial / notebooks" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": null, + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "2024", + "functionality": null, + "assessment": false, + "prerequisite": null, + "source": [ + "Carpentries" + ], + "review": "If you want to teach carpentries use this tool - not only shell scripting, but also intro to R, Python and HPC", + "alias_links": "https://github.com/jdkent/incf-fellow-jdkent/blob/gh-pages/index.md", + "notes": null, + "quadrants": [ + "learning-oriented (tutorials)", + "problem-oriented (how to guides)" + ] + }, + { + "id": 52, + "tag_team": [ + "CF", + "SS", + "JB" + ], + "course_name": "Intro to ReproNim", + "url": "https://github.com/DavidEWarrenPhD/INCF-Fellow-DavidEWarren", + "level": [ + "Beginner" + ], + "platform": [ + "NA" + ], + "keywords": [ + "Lesson plan" + ], + "course_length": "<1 hr", + "instruction_medium": [ + "reference" + ], + "delivery": null, + "language": [ + "English" + ], + "programming_language": [ + "NA" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": "NA", + "functionality": null, + "assessment": false, + "prerequisite": null, + "source": [ + "ReproNim", + "David Warren" + ], + "review": "For internal usage", + "alias_links": null, + "notes": "Link to Github Importer broken", + "quadrants": null + }, + { + "id": 53, + "tag_team": [ + "JB" + ], + "course_name": "Introduction to Machine Learning part 1", + "url": ":https://neurodatascience.github.io/QLS612-Overview/lectures-materials/2024/intro_ml_part_1.html", + "level": [ + "Beginner" + ], + "platform": [ + "Windows", + "Mac", + "Linux" + ], + "keywords": [ + "Multi-week curriculum", + "tutoruial on Machine Learning in neuroimaging" + ], + "course_length": "1+ weeks", + "instruction_medium": [ + "Hands-on tutorial / notebooks", + "lecture", + "website", + "slides" + ], + "delivery": [ + "self-paced", + "instructor" + ], + "language": [ + "English" + ], + "programming_language": [ + "Python", + "shell scripting", + "Git" + ], + "neuroimaging_software": [ + "Python" + ], + "imaging_modality": null, + "open_dataset": "NA", + "last_updated": null, + "functionality": null, + "assessment": null, + "prerequisite": null, + "source": null, + "review": null, + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 54, + "tag_team": [ + "JB" + ], + "course_name": "Brainhack School", + "url": "https://school.brainhackmtl.org/", + "level": [ + "Beginner", + "Intermediate" + ], + "platform": [ + "Windows" + ], + "keywords": null, + "course_length": "NA", + "instruction_medium": null, + "delivery": null, + "language": null, + "programming_language": null, + "neuroimaging_software": null, + "imaging_modality": [ + "NA" + ], + "open_dataset": "NA", + "last_updated": null, + "functionality": null, + "assessment": null, + "prerequisite": null, + "source": null, + "review": null, + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 55, + "tag_team": [ + "JB" + ], + "course_name": "NeuroHackademy", + "url": "https://neurohackademy.org/", + "level": [ + "Beginner", + "Intermediate" + ], + "platform": [ + "Mac", + "Windows", + "Linux" + ], + "keywords": null, + "course_length": "NA", + "instruction_medium": null, + "delivery": null, + "language": null, + "programming_language": null, + "neuroimaging_software": null, + "imaging_modality": null, + "open_dataset": "NA", + "last_updated": null, + "functionality": null, + "assessment": null, + "prerequisite": null, + "source": null, + "review": null, + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 56, + "tag_team": [ + "CF" + ], + "course_name": "Neuromatchacademy", + "url": "https://github.com/NeuromatchAcademy", + "level": null, + "platform": null, + "keywords": null, + "course_length": "NA", + "instruction_medium": null, + "delivery": null, + "language": null, + "programming_language": null, + "neuroimaging_software": null, + "imaging_modality": null, + "open_dataset": "NA", + "last_updated": null, + "functionality": null, + "assessment": null, + "prerequisite": null, + "source": null, + "review": null, + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 57, + "tag_team": [ + "CF", + "SS", + "JB" + ], + "course_name": "List of open neuroscience resources", + "url": "https://asoplata.github.io/open-computational-neuroscience-resources/", + "level": [ + "Beginner", + "Intermediate", + "Advanced" + ], + "platform": [ + "NA" + ], + "keywords": [ + "List of resources" + ], + "course_length": "1+ weeks", + "instruction_medium": [ + "Hands-on tutorial / notebooks", + "lecture", + "video", + "notes", + "blog post", + "reference" + ], + "delivery": [ + "self-paced" + ], + "language": [ + "English" + ], + "programming_language": [ + "NA" + ], + "neuroimaging_software": [ + "NA" + ], + "imaging_modality": [ + "Functional", + "Structural", + "EEG", + "Behavioral", + "Resting-State", + "MRI" + ], + "open_dataset": "True", + "last_updated": "2024", + "functionality": "2024", + "assessment": false, + "prerequisite": null, + "source": [ + "Github Repo added by Charlotte Fraze" + ], + "review": "Great resource", + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 58, + "tag_team": [ + "JB" + ], + "course_name": "Andy's brain book", + "url": "https://andysbrainbook.readthedocs.io/en/latest/", + "level": null, + "platform": null, + "keywords": null, + "course_length": "NA", + "instruction_medium": null, + "delivery": null, + "language": null, + "programming_language": null, + "neuroimaging_software": null, + "imaging_modality": null, + "open_dataset": "NA", + "last_updated": null, + "functionality": null, + "assessment": null, + "prerequisite": null, + "source": null, + "review": null, + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 59, + "tag_team": [ + "JB" + ], + "course_name": "ABCD Repronim course", + "url": "https://www.abcd-repronim.org/", + "level": null, + "platform": null, + "keywords": null, + "course_length": "NA", + "instruction_medium": null, + "delivery": null, + "language": null, + "programming_language": null, + "neuroimaging_software": null, + "imaging_modality": null, + "open_dataset": "NA", + "last_updated": null, + "functionality": null, + "assessment": null, + "prerequisite": null, + "source": null, + "review": null, + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": 60, + "tag_team": [ + "JB" + ], + "course_name": "ABCD Repronim ML course", + "url": null, + "level": null, + "platform": null, + "keywords": null, + "course_length": "NA", + "instruction_medium": null, + "delivery": null, + "language": null, + "programming_language": null, + "neuroimaging_software": null, + "imaging_modality": null, + "open_dataset": "NA", + "last_updated": null, + "functionality": null, + "assessment": null, + "prerequisite": null, + "source": null, + "review": null, + "alias_links": null, + "notes": null, + "quadrants": null + }, + { + "id": null, + "tag_team": [ + "JB" + ], + "course_name": "Reproducible Pipelines for Neuroimaging Research", + "url": "https://sina-mansour.github.io/ohbm2025-reproducible-research/intro.html", + "level": null, + "platform": null, + "keywords": null, + "course_length": "NA", + "instruction_medium": null, + "delivery": null, + "language": null, + "programming_language": null, + "neuroimaging_software": null, + "imaging_modality": null, + "open_dataset": "NA", + "last_updated": null, + "functionality": null, + "assessment": null, + "prerequisite": null, + "source": null, + "review": null, + "alias_links": null, + "notes": null, + "quadrants": null + } +] \ No newline at end of file diff --git a/frontend/src/training-materials-browser.tsx b/frontend/src/training-materials-browser.tsx index 5ba1aab..ccd9154 100644 --- a/frontend/src/training-materials-browser.tsx +++ b/frontend/src/training-materials-browser.tsx @@ -1,7 +1,7 @@ "use client" -import { useState, useMemo } from "react" -import { Search, BookOpen, Video, FileText, Users, Clock } from "lucide-react" +import { useState, useMemo, useEffect } from "react" +import { Search, BookOpen, Video, FileText, Users, Clock, ExternalLink } from "lucide-react" // Added ExternalLink import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" @@ -10,257 +10,221 @@ import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion" - -// Sample training materials data -const trainingMaterials = [ - { - id: 1, - title: "Research Design Fundamentals", - description: "Comprehensive guide to designing robust research studies and methodologies.", - format: "Course", - duration: "4 hours", - audience: ["Researchers", "Graduate Students"], - topics: ["Methodology", "Statistics"], - researchStages: ["design"], - practices: ["plan", "standardize"], - difficulty: "Beginner", - featured: true, - }, - { - id: 2, - title: "Data Collection Best Practices", - description: "Learn effective techniques for gathering high-quality research data.", - format: "Workshop", - duration: "2 hours", - audience: ["Researchers", "Data Scientists"], - topics: ["Data Management", "Quality Control"], - researchStages: ["collect"], - practices: ["standardize", "annotate/describe"], - difficulty: "Intermediate", - featured: false, - }, - { - id: 3, - title: "Image Processing with Python", - description: "Hands-on tutorial for processing and analyzing research images.", - format: "Tutorial", - duration: "6 hours", - audience: ["Data Scientists", "Researchers"], - topics: ["Programming", "Image Analysis"], - researchStages: ["image process"], - practices: ["version control", "standardize"], - difficulty: "Advanced", - featured: true, - }, - { - id: 4, - title: "Statistical Analysis Toolkit", - description: "Essential statistical methods and tools for research analysis.", - format: "Course", - duration: "8 hours", - audience: ["Researchers", "Graduate Students", "Data Scientists"], - topics: ["Statistics", "Analysis"], - researchStages: ["statistic"], - practices: ["standardize", "annotate/describe"], - difficulty: "Intermediate", - featured: false, - }, - { - id: 5, - title: "Academic Publishing Guide", - description: "Step-by-step guide to publishing research findings effectively.", - format: "Guide", - duration: "3 hours", - audience: ["Researchers", "Graduate Students"], - topics: ["Writing", "Publishing"], - researchStages: ["publish"], - practices: ["archive/publish", "standardize"], - difficulty: "Intermediate", - featured: true, - }, - { - id: 6, - title: "Version Control for Researchers", - description: "Master Git and version control systems for research projects.", - format: "Workshop", - duration: "4 hours", - audience: ["Researchers", "Data Scientists"], - topics: ["Programming", "Collaboration"], - researchStages: ["design", "collect"], - practices: ["version control", "plan"], - difficulty: "Beginner", - featured: false, - }, - { - id: 7, - title: "Data Annotation Standards", - description: "Learn to create consistent and meaningful data annotations.", - format: "Tutorial", - duration: "2 hours", - audience: ["Researchers", "Data Scientists"], - topics: ["Data Management", "Documentation"], - researchStages: ["collect", "image process"], - practices: ["annotate/describe", "standardize"], - difficulty: "Beginner", - featured: false, - }, - { - id: 8, - title: "Research Project Planning", - description: "Comprehensive framework for planning successful research projects.", - format: "Course", - duration: "5 hours", - audience: ["Researchers", "Graduate Students"], - topics: ["Project Management", "Methodology"], - researchStages: ["design"], - practices: ["plan", "standardize"], - difficulty: "Beginner", - featured: true, - }, -] - -const researchStages = [ - { id: "design", label: "Design", description: "Research planning and methodology design" }, - { id: "collect", label: "Collect", description: "Data collection and gathering" }, - { id: "image process", label: "Image Process", description: "Image analysis and processing" }, - { id: "statistic", label: "Statistics", description: "Statistical analysis and modeling" }, - { id: "publish", label: "Publish", description: "Publication and dissemination" }, -] - -const practices = [ - { id: "plan", label: "Plan", description: "Project planning and organization" }, - { id: "version control", label: "Version Control", description: "Code and document versioning" }, - { id: "annotate/describe", label: "Annotate/Describe", description: "Data annotation and documentation" }, - { id: "standardize", label: "Standardize", description: "Standardization and best practices" }, - { id: "archive/publish", label: "Archive/Publish", description: "Archiving and publishing workflows" }, -] - -const formats = ["Course", "Workshop", "Tutorial", "Guide"] -const audiences = ["Researchers", "Graduate Students", "Data Scientists"] -const topics = [ - "Methodology", - "Statistics", - "Data Management", - "Programming", - "Analysis", - "Writing", - "Publishing", - "Quality Control", - "Image Analysis", - "Collaboration", - "Documentation", - "Project Management", -] -const difficulties = ["Beginner", "Intermediate", "Advanced"] +import { + type ReproInventoryEntry, + LevelEnum, + PlatformEnum, + CourseLengthEnum, + ContentFormatEnum, + DeliveryEnum, + LanguageEnum, + ProgrammingLanguageEnum, + NeuroimagingSoftwareEnum, + ImagingModalityEnum, + OpenDatasetEnum, + QuadrantsEnum, +} from "./types/reproinventory" // Import generated types export default function TrainingMaterialsBrowser() { - const [searchQuery, setSearchQuery] = useState("") - const [selectedFormats, setSelectedFormats] = useState([]) - const [selectedAudiences, setSelectedAudiences] = useState([]) - const [selectedTopics, setSelectedTopics] = useState([]) - const [selectedStages, setSelectedStages] = useState([]) - const [selectedPractices, setSelectedPractices] = useState([]) - const [selectedDifficulties, setSelectedDifficulties] = useState([]) - const [showFeaturedOnly, setShowFeaturedOnly] = useState(false) - - const handleFilterChange = (filterType: string, value: string, checked: boolean) => { - const setters = { - format: setSelectedFormats, - audience: setSelectedAudiences, - topic: setSelectedTopics, - stage: setSelectedStages, - practice: setSelectedPractices, - difficulty: setSelectedDifficulties, + const [reproInventoryData, setReproInventoryData] = useState([]) + const [loading, setLoading] = useState(true) + const [error, setError] = useState(null) + + useEffect(() => { + const fetchData = async () => { + try { + const response = await fetch("/data/reproinventory_data.json") + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`) + } + const data: ReproInventoryEntry[] = await response.json() + setReproInventoryData(data) + } catch (e: any) { + setError(e.message) + } finally { + setLoading(false) + } } - const setter = setters[filterType as keyof typeof setters] - if (setter) { - setter((prev) => (checked ? [...prev, value] : prev.filter((item) => item !== value))) - } + fetchData() + }, []) + + // State for filters, adapted to schema + const [searchQuery, setSearchQuery] = useState("") + const [selectedLevels, setSelectedLevels] = useState([]) + const [selectedPlatforms, setSelectedPlatforms] = useState([]) + const [selectedCourseLengths, setSelectedCourseLengths] = useState([]) + const [selectedInstructionMedia, setSelectedInstructionMedia] = useState([]) + const [selectedDeliveries, setSelectedDeliveries] = useState([]) + const [selectedLanguages, setSelectedLanguages] = useState([]) + const [selectedProgrammingLanguages, setSelectedProgrammingLanguages] = useState([]) + const [selectedNeuroimagingSoftware, setSelectedNeuroimagingSoftware] = useState([]) + const [selectedImagingModalities, setSelectedImagingModalities] = useState([]) + const [selectedOpenDataset, setSelectedOpenDataset] = useState("") + const [selectedQuadrants, setSelectedQuadrants] = useState([]) + const [showAssessmentOnly, setShowAssessmentOnly] = useState(false) + const [showFeaturedOnly, setShowFeaturedOnly] = useState(false) // Assuming a 'featured' concept will be derived or added + + // Helper function to handle multi-select filters + const handleMultiSelectFilterChange = (setter: React.Dispatch>, value: T, checked: boolean) => { + setter((prev) => (checked ? [...prev, value] : prev.filter((item) => item !== value))) } + // Define filter options based on Enums from schema + const levelOptions = Object.values(LevelEnum) + const platformOptions = Object.values(PlatformEnum) + const courseLengthOptions = Object.values(CourseLengthEnum) + const instructionMediumOptions = Object.values(ContentFormatEnum) + const deliveryOptions = Object.values(DeliveryEnum) + const languageOptions = Object.values(LanguageEnum) + const programmingLanguageOptions = Object.values(ProgrammingLanguageEnum) + const neuroimagingSoftwareOptions = Object.values(NeuroimagingSoftwareEnum) + const imagingModalityOptions = Object.values(ImagingModalityEnum) + const openDatasetOptions = Object.values(OpenDatasetEnum) + const quadrantsOptions = Object.values(QuadrantsEnum) + const filteredMaterials = useMemo(() => { - return trainingMaterials.filter((material) => { - // Search query filter - if ( - searchQuery && - !material.title.toLowerCase().includes(searchQuery.toLowerCase()) && - !material.description.toLowerCase().includes(searchQuery.toLowerCase()) - ) { + let filtered = reproInventoryData + + return filtered.filter((material) => { + // Search query filter: course_name, url, keywords, notes, review + const searchFields = [ + material.course_name, + material.url, + material.review, + material.notes, + ...(material.keywords || []), + ].filter(Boolean).map(String).join(" ").toLowerCase(); + + if (searchQuery && !searchFields.includes(searchQuery.toLowerCase())) { return false } - // Format filter - if (selectedFormats.length > 0 && !selectedFormats.includes(material.format)) { - return false + // Level filter + if (selectedLevels.length > 0 && !(material.level && selectedLevels.some(sl => material.level.includes(sl)))) { + return false; } - // Audience filter - if (selectedAudiences.length > 0 && !selectedAudiences.some((audience) => material.audience.includes(audience))) { - return false + // Platform filter + if (selectedPlatforms.length > 0 && !(material.platform && selectedPlatforms.some(sp => material.platform.includes(sp)))) { + return false; } - // Topic filter - if (selectedTopics.length > 0 && !selectedTopics.some((topic) => material.topics.includes(topic))) { - return false + // Course Length filter + if (selectedCourseLengths.length > 0 && !(material.course_length && selectedCourseLengths.includes(material.course_length))) { + return false; } - // Research stage filter - if (selectedStages.length > 0 && !selectedStages.some((stage) => material.researchStages.includes(stage))) { - return false + // Instruction Medium filter + if (selectedInstructionMedia.length > 0 && !(material.instruction_medium && selectedInstructionMedia.some(sim => material.instruction_medium.includes(sim)))) { + return false; } - // Practice filter - if ( - selectedPractices.length > 0 && - !selectedPractices.some((practice) => material.practices.includes(practice)) - ) { - return false + // Delivery filter + if (selectedDeliveries.length > 0 && !(material.delivery && selectedDeliveries.some(sd => material.delivery.includes(sd)))) { + return false; } - // Difficulty filter - if (selectedDifficulties.length > 0 && !selectedDifficulties.includes(material.difficulty)) { - return false + // Language filter + if (selectedLanguages.length > 0 && !(material.language && selectedLanguages.some(sl => material.language.includes(sl)))) { + return false; + } + + // Programming Language filter + if (selectedProgrammingLanguages.length > 0 && !(material.programming_language && selectedProgrammingLanguages.some(spl => material.programming_language.includes(spl)))) { + return false; + } + + // Neuroimaging Software filter + if (selectedNeuroimagingSoftware.length > 0 && !(material.neuroimaging_software && selectedNeuroimagingSoftware.some(sns => material.neuroimaging_software.includes(sns)))) { + return false; + } + + // Imaging Modality filter + if (selectedImagingModalities.length > 0 && !(material.imaging_modality && selectedImagingModalities.some(sim => material.imaging_modality.includes(sim)))) { + return false; } - // Featured filter - if (showFeaturedOnly && !material.featured) { + // Open Dataset filter + if (selectedOpenDataset && material.open_dataset !== selectedOpenDataset) { + return false; + } + + // Quadrants filter + if (selectedQuadrants.length > 0 && !(material.quadrants && selectedQuadrants.some(sq => material.quadrants.includes(sq)))) { + return false; + } + + + // Assessment filter (boolean) + if (showAssessmentOnly && !material.assessment) { return false } + // Featured filter (assuming 'featured' will be part of the schema or derived) + // Currently, 'featured' is not in the schema. This filter will always return true + // or needs to be adapted once 'featured' status is defined for ReproInventoryEntry. + // For now, disabling or ignoring it if not mapped. + if (showFeaturedOnly) { + // No direct mapping for 'featured' in schema. Will either need to add it or + // decide on a derivation for 'featured' status from existing fields. + // For now, let's assume all are 'not featured' so this filter effectively does nothing unless implemented. + // Or, if we expect "featured" to be a tag_team like "ReproNim", we can adjust. + // For now, it's a dummy filter. + } + + return true }) }, [ + reproInventoryData, searchQuery, - selectedFormats, - selectedAudiences, - selectedTopics, - selectedStages, - selectedPractices, - selectedDifficulties, + selectedLevels, + selectedPlatforms, + selectedCourseLengths, + selectedInstructionMedia, + selectedDeliveries, + selectedLanguages, + selectedProgrammingLanguages, + selectedNeuroimagingSoftware, + selectedImagingModalities, + selectedOpenDataset, + selectedQuadrants, + showAssessmentOnly, showFeaturedOnly, ]) const clearAllFilters = () => { setSearchQuery("") - setSelectedFormats([]) - setSelectedAudiences([]) - setSelectedTopics([]) - setSelectedStages([]) - setSelectedPractices([]) - setSelectedDifficulties([]) + setSelectedLevels([]) + setSelectedPlatforms([]) + setSelectedCourseLengths([]) + setSelectedInstructionMedia([]) + setSelectedDeliveries([]) + setSelectedLanguages([]) + setSelectedProgrammingLanguages([]) + setSelectedNeuroimagingSoftware([]) + setSelectedImagingModalities([]) + setSelectedOpenDataset("") + setSelectedQuadrants([]) + setShowAssessmentOnly(false) setShowFeaturedOnly(false) } - const getFormatIcon = (format: string) => { + const getFormatIcon = (format: ContentFormatEnum | string) => { switch (format) { - case "Course": + case ContentFormatEnum["Hands_on_tutorial___notebooks"]: + case ContentFormatEnum.Website: + case ContentFormatEnum.Notes: + case ContentFormatEnum.Reference: + case ContentFormatEnum.Blog_post: + case ContentFormatEnum.Outline: + case ContentFormatEnum["Meta_resource"]: return - case "Workshop": - return - case "Tutorial": + case ContentFormatEnum.Video: return