Skip to content

Allow proposals to be associated with multiple projects (Fixes #1861)#1864

Merged
vvolkl merged 4 commits intoHSF:mainfrom
sm-28601:fix-multi-project-proposals
Feb 18, 2026
Merged

Allow proposals to be associated with multiple projects (Fixes #1861)#1864
vvolkl merged 4 commits intoHSF:mainfrom
sm-28601:fix-multi-project-proposals

Conversation

@sm-28601
Copy link
Contributor

This PR resolves issue #1861 by allowing proposals to be associated with multiple projects.

Changes:

  • Updated proposal filtering logic to support both single and multiple project values.
  • Modified GSoC and GSoDocs proposal layouts to display multiple corresponding projects.
  • Maintained backward compatibility with existing single-project proposals.

Testing:

  • Verified locally using Jekyll.

  • A proposal with:
    project:
    - Geant4
    - ML4EP
    now appears on both:

    • Geant4 project page
    • ML4EP project page
  • Proposal page now displays:
    Corresponding Projects

    • Geant4
    • ML4EP

Fixes #1861.

Screenshot 2026-02-17 144910 Screenshot 2026-02-17 144933

Copilot AI review requested due to automatic review settings February 17, 2026 09:20
@netlify
Copy link

netlify bot commented Feb 17, 2026

Deploy Preview for earnest-hotteok-b1e1bf ready!

Name Link
🔨 Latest commit 114206c
🔍 Latest deploy log https://app.netlify.com/projects/earnest-hotteok-b1e1bf/deploys/69956d2f1cf71100081d3165
😎 Deploy Preview https://deploy-preview-1864--earnest-hotteok-b1e1bf.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR addresses #1861 by extending the GSoC / GSoDocs proposal pages and project proposal listings so a single proposal can be associated with multiple projects, while aiming to preserve support for existing single-project proposals.

Changes:

  • Updated project-page proposal filtering to match proposals against multiple project values (with case/whitespace normalization).
  • Updated GSoC and GSoDocs proposal layouts to render a list of corresponding projects instead of a single link.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.

File Description
_layouts/gsoc_proposal.html Renders “Corresponding Project(s)” as a list of project links.
_layouts/gsdocs_proposal.html Same multi-project rendering for GSoDocs proposal pages.
_includes/gsoc_project.ext Adjusts proposal filtering to handle multi-project values and trims whitespace before comparing.
_includes/gsdocs_project.ext Same filtering adjustments for GSoDocs project pages.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 55 to 57
<h2>Corresponding Project{% if page.project.size > 1 %}s{% endif %}</h2>
<ul>
{% for proj in page.project %}
Copy link

Copilot AI Feb 17, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

page.project is a scalar string in most existing proposals (e.g., project: Geant4). In Liquid, page.project.size then becomes the string length, so this will almost always pluralize to “Corresponding Projects” even for single-project proposals, undermining the stated backward compatibility. Consider normalizing page.project to an array first (as done in the project listing include) and then basing both pluralization and the loop on that normalized array.

Suggested change
<h2>Corresponding Project{% if page.project.size > 1 %}s{% endif %}</h2>
<ul>
{% for proj in page.project %}
{% assign projects = page.project | split: ',' %}
<h2>Corresponding Project{% if projects.size > 1 %}s{% endif %}</h2>
<ul>
{% for proj in projects %}

Copilot uses AI. Check for mistakes.
Comment on lines 11 to 13
<h2>Corresponding Project{% if page.project.size > 1 %}s{% endif %}</h2>
<ul>
{% for proj in page.project %}
Copy link

Copilot AI Feb 17, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as the GSoC layout: most existing proposals define project as a scalar (e.g., project: ROOT), so page.project.size will be the string length and will incorrectly pluralize the heading. Normalize page.project to an array first and use the normalized array for both the pluralization check and the {% for %} loop to keep single-project proposals rendering correctly.

Suggested change
<h2>Corresponding Project{% if page.project.size > 1 %}s{% endif %}</h2>
<ul>
{% for proj in page.project %}
{% assign projects = page.project | join: ',' | split: ',' %}
<h2>Corresponding Project{% if projects.size > 1 %}s{% endif %}</h2>
<ul>
{% for proj in projects %}

Copilot uses AI. Check for mistakes.
Comment on lines 42 to 43
{% endfor %}{% endif %}
{% endfor %}
Copy link

Copilot AI Feb 17, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

{% endfor %}{% endif %} on the same line makes the Liquid control flow harder to read and is inconsistent with the surrounding formatting in this include. Split these tags onto separate lines to keep the template maintainable.

Suggested change
{% endfor %}{% endif %}
{% endfor %}
{% endfor %}
{% endif %}
{% endfor %}

Copilot uses AI. Check for mistakes.
@vvolkl
Copy link
Contributor

vvolkl commented Feb 17, 2026

Very nice, thank you Sahil! One small thing, in this list [1] we typically prefix the projects. If here are several, they currently still get concatenated without spaces, which is not ideal. I think we can either just use the first project in this list, or use a loop to display them as

| [**{{ proposal.project1 / proposal.project2 / ... }}:** {{ proposal.title }} ]( {{ proposal.url }} ) | 

[1] https://github.com/HSF/hsf.github.io/blob/main/gsoc/2026/summary.md?plain=1

@github-actions github-actions bot added the GSoC Related to Google Summer of Code activity label Feb 17, 2026
@sm-28601
Copy link
Contributor Author

Very nice, thank you Sahil! One small thing, in this list [1] we typically prefix the projects. If here are several, they currently still get concatenated without spaces, which is not ideal. I think we can either just use the first project in this list, or use a loop to display them as

| [**{{ proposal.project1 / proposal.project2 / ... }}:** {{ proposal.title }} ]( {{ proposal.url }} ) | 

[1] https://github.com/HSF/hsf.github.io/blob/main/gsoc/2026/summary.md?plain=1

Thanks for the feedback! I’ve updated the summary page .

@vvolkl
Copy link
Contributor

vvolkl commented Feb 17, 2026

Hmm, yes, the string is correct now but something broke the display of the list, see https://deploy-preview-1864--earnest-hotteok-b1e1bf.netlify.app/gsoc/2026/summary vs https://hepsoftwarefoundation.org/gsoc/2026/summary.html

@sm-28601
Copy link
Contributor Author

sm-28601 commented Feb 18, 2026

Hmm, yes, the string is correct now but something broke the display of the list, see https://deploy-preview-1864--earnest-hotteok-b1e1bf.netlify.app/gsoc/2026/summary vs https://hepsoftwarefoundation.org/gsoc/2026/summary.html

I’ve tested it locally and it’s now displaying correctly. Let me know if any further changes are needed.

record.mp4

Copy link
Contributor

@vvolkl vvolkl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, now it looks good. Many thanks @sm-28601 !

@vvolkl vvolkl merged commit cc6551d into HSF:main Feb 18, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

GSoC Related to Google Summer of Code activity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

GSoC: allow proposals to be associated to multiple projects

2 participants

Comments