Make portfolio + highlights a re-usable macro
- Use more generic metadata key names for portfolio
This commit is contained in:
21
.eleventy.js
21
.eleventy.js
@@ -3,9 +3,9 @@ module.exports = function (eleventyConfig) {
|
||||
eleventyConfig.addPassthroughCopy("./src/assets");
|
||||
eleventyConfig.addPassthroughCopy("./src/scripts");
|
||||
|
||||
eleventyConfig.addFilter('findProjectAssociatedWithExperience', function (projects, associatedExperience) {
|
||||
return projects.filter(function(project) {
|
||||
return project.data.associatedExperience == associatedExperience;
|
||||
eleventyConfig.addFilter('findAssociation', function (entries, associatedEntry) {
|
||||
return entries.filter(function(entry) {
|
||||
return entry.data.associatedEntry == associatedEntry;
|
||||
});
|
||||
})
|
||||
|
||||
@@ -15,18 +15,19 @@ module.exports = function (eleventyConfig) {
|
||||
.sort((a, b) => (Number(a.data.displayOrder) < Number(b.data.displayOrder) ? 1 : -1));
|
||||
});
|
||||
|
||||
eleventyConfig.addCollection('professionalExperienceProjects', (collection) => {
|
||||
return collection
|
||||
.getFilteredByGlob('./src/portfolio/professionalExperience/projects/*.md')
|
||||
.sort((a, b) => (Number(a.data.displayOrder) > Number(b.data.displayOrder) ? 1 : -1));
|
||||
});
|
||||
|
||||
eleventyConfig.addCollection('degrees', (collection) => {
|
||||
eleventyConfig.addCollection('education', (collection) => {
|
||||
return collection
|
||||
.getFilteredByGlob('./src/portfolio/education/*.md')
|
||||
.sort((a, b) => (Number(a.data.displayOrder) < Number(b.data.displayOrder) ? 1 : -1));
|
||||
});
|
||||
|
||||
|
||||
eleventyConfig.addCollection('highlights', (collection) => {
|
||||
return collection
|
||||
.getFilteredByGlob('./src/portfolio/highlights/*.md')
|
||||
.sort((a, b) => (Number(a.data.displayOrder) > Number(b.data.displayOrder) ? 1 : -1));
|
||||
});
|
||||
|
||||
return {
|
||||
markdownTemplateEngine: "njk",
|
||||
dataTemplateEngine: "njk",
|
||||
|
@@ -8,3 +8,51 @@
|
||||
</div>
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro portfolioWithHighlights(portfolio, highlights) %}
|
||||
{% for entry in portfolio %}
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<a href="{{ entry.data.url }}" target="_blank">
|
||||
<img
|
||||
class="img-fluid mx-auto d-block"
|
||||
src="{{ entry.data.logo }}"
|
||||
/>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<h2><b>{{ entry.data.association }}</b></h2>
|
||||
<h3>{{ entry.data.entryTitle }}</h3>
|
||||
<h4>{{ entry.data.location }}</h4>
|
||||
<h5><i>{{ entry.data.startDate }} - {{ entry.data.endDate }}</i></h5>
|
||||
{{ entry.content | safe }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% set associatedHighlights = (highlights | findAssociation(entry.data.id)) %}
|
||||
{% if associatedHighlights.length > 0 %}
|
||||
<div class="col-md-6">
|
||||
<div class="accordion accordion-flush" id="{{ entry.data.id }}">
|
||||
{% for highlight in associatedHighlights %}
|
||||
{% set highlightSlug = (entry.data.id + '-' + highlight.data.name | slugify) %}
|
||||
<div class="accordion-item">
|
||||
<div class="accordion-header"">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#{{ highlightSlug }}">
|
||||
<b>{{ highlight.data.name }}</b>
|
||||
</button>
|
||||
</div>
|
||||
<div id="{{ highlightSlug }}" class="accordion-collapse collapse" data-bs-parent="#{{ entry.data.id }}">
|
||||
<div class="accordion-body">
|
||||
{{ highlight.content | safe }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endmacro %}
|
@@ -2,26 +2,5 @@
|
||||
{% from "macros.html" import sectionHeading %}
|
||||
{{ sectionHeading("Education") }}
|
||||
|
||||
{% for degree in collections.degrees %}
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<a href="{{ degree.data.degreeUrl }}" target="_blank">
|
||||
<img
|
||||
class="img-fluid mx-auto d-block"
|
||||
src="{{ degree.data.degreeLogo }}"
|
||||
/>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<h2><b>{{ degree.data.schoolName }}</b></h2>
|
||||
<h3>{{ degree.data.degreeName }}</h3>
|
||||
<h4>{{ degree.data.schoolLocation }}</h4>
|
||||
<h5><i>{{ degree.data.startDate }} - {{ degree.data.endDate }}</i></h5>
|
||||
{{ degree.content | safe }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% from "macros.html" import portfolioWithHighlights %}
|
||||
{{ portfolioWithHighlights(collections.education, collections.highlights) }}
|
@@ -2,47 +2,5 @@
|
||||
{% from "macros.html" import sectionHeading %}
|
||||
{{ sectionHeading("Professional Experience") }}
|
||||
|
||||
{% for profExp in collections.professionalExperience %}
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<a href="{{ profExp.data.companyUrl }}" target="_blank">
|
||||
<img
|
||||
class="img-fluid mx-auto d-block"
|
||||
src="{{ profExp.data.companyLogo }}"
|
||||
/>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<h2><b>{{ profExp.data.companyName }}</b></h2>
|
||||
<h3>{{ profExp.data.jobTitle }}</h3>
|
||||
<h4>{{ profExp.data.workLocation }}</h4>
|
||||
<h5><i>{{ profExp.data.startDate }} - {{ profExp.data.endDate }}</i></h5>
|
||||
{{ profExp.content | safe }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% if collections.professionalExperienceProjects.length > 0 %}
|
||||
<div class="col-md-6">
|
||||
<div class="accordion accordion-flush" id="{{ profExp.data.id }}">
|
||||
{% for project in (collections.professionalExperienceProjects | findProjectAssociatedWithExperience(profExp.data.id)) %}
|
||||
{% set projectSlug = (profExp.data.id + '-' + project.data.name | slugify) %}
|
||||
<div class="accordion-item">
|
||||
<div class="accordion-header"">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#{{ projectSlug }}">
|
||||
<b>{{ project.data.name }}</b>
|
||||
</button>
|
||||
</div>
|
||||
<div id="{{ projectSlug }}" class="accordion-collapse collapse" data-bs-parent="#{{ profExp.data.id }}">
|
||||
<div class="accordion-body">
|
||||
{{ project.content | safe }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% from "macros.html" import portfolioWithHighlights %}
|
||||
{{ portfolioWithHighlights(collections.professionalExperience, collections.highlights) }}
|
@@ -1,10 +1,11 @@
|
||||
---
|
||||
displayOrder: 1
|
||||
degreeUrl: "https://cse.engin.umich.edu"
|
||||
degreeLogo: "/assets/education/logo-computer-science.jpg"
|
||||
schoolName: "University of Michigan"
|
||||
degreeName: "B.S.E. in Computer Science"
|
||||
schoolLocation: "Ann Arbor, MI"
|
||||
id: "umich-1"
|
||||
url: "https://cse.engin.umich.edu"
|
||||
logo: "/assets/education/logo-computer-science.jpg"
|
||||
association: "University of Michigan"
|
||||
entryTitle: "B.S.E. in Computer Science"
|
||||
location: "Ann Arbor, MI"
|
||||
startDate: "September 2016"
|
||||
endDate: "December 2020"
|
||||
---
|
||||
|
@@ -1,10 +1,11 @@
|
||||
---
|
||||
displayOrder: 2
|
||||
degreeUrl: "https://me.engin.umich.edu"
|
||||
degreeLogo: "/assets/education/logo-mechanical-engineering.jpg"
|
||||
schoolName: "University of Michigan"
|
||||
degreeName: "B.S.E. in Mechanical Engineering"
|
||||
schoolLocation: "Ann Arbor, MI"
|
||||
id: "umich-2"
|
||||
url: "https://me.engin.umich.edu"
|
||||
logo: "/assets/education/logo-mechanical-engineering.jpg"
|
||||
association: "University of Michigan"
|
||||
entryTitle: "B.S.E. in Mechanical Engineering"
|
||||
location: "Ann Arbor, MI"
|
||||
startDate: "September 2016"
|
||||
endDate: "December 2020"
|
||||
---
|
||||
|
@@ -1,10 +1,11 @@
|
||||
---
|
||||
displayOrder: 3
|
||||
degreeUrl: "https://robotics.umich.edu"
|
||||
degreeLogo: "/assets/education/logo-robotics.png"
|
||||
schoolName: "University of Michigan"
|
||||
degreeName: "M.S. in Robotics"
|
||||
schoolLocation: "Ann Arbor, MI"
|
||||
id: "umich-3"
|
||||
url: "https://robotics.umich.edu"
|
||||
logo: "/assets/education/logo-robotics.png"
|
||||
association: "University of Michigan"
|
||||
entryTitle: "M.S. in Robotics"
|
||||
location: "Ann Arbor, MI"
|
||||
startDate: "January 2021"
|
||||
endDate: "December 2021"
|
||||
---
|
||||
|
@@ -1,5 +1,5 @@
|
||||
---
|
||||
associatedExperience: "hughes-1"
|
||||
associatedEntry: "hughes-1"
|
||||
name: "Mobile Terminal Configuration Tool"
|
||||
displayOrder: 1
|
||||
---
|
@@ -1,5 +1,5 @@
|
||||
---
|
||||
associatedExperience: "hughes-1"
|
||||
associatedEntry: "hughes-1"
|
||||
name: "Location Based Services"
|
||||
displayOrder: 2
|
||||
---
|
@@ -1,5 +1,5 @@
|
||||
---
|
||||
associatedExperience: "mitre-1"
|
||||
associatedEntry: "mitre-1"
|
||||
name: "PNT Defense & Threat Library"
|
||||
displayOrder: 1
|
||||
---
|
@@ -1,5 +1,5 @@
|
||||
---
|
||||
associatedExperience: "mitre-1"
|
||||
associatedEntry: "mitre-1"
|
||||
name: "PNT Assurance"
|
||||
displayOrder: 2
|
||||
---
|
@@ -1,5 +1,5 @@
|
||||
---
|
||||
associatedExperience: "mitre-1"
|
||||
associatedEntry: "mitre-1"
|
||||
name: "AI Learning Track"
|
||||
displayOrder: 3
|
||||
---
|
@@ -1,5 +1,5 @@
|
||||
---
|
||||
associatedExperience: "mitre-1"
|
||||
associatedEntry: "mitre-1"
|
||||
name: "AWS DeepRacer"
|
||||
displayOrder: 4
|
||||
---
|
@@ -1,5 +1,5 @@
|
||||
---
|
||||
associatedExperience: "rivian-1"
|
||||
associatedEntry: "rivian-1"
|
||||
name: "Requirements Management and System Diagrams"
|
||||
displayOrder: 1
|
||||
---
|
@@ -1,5 +1,5 @@
|
||||
---
|
||||
associatedExperience: "rivian-1"
|
||||
associatedEntry: "rivian-1"
|
||||
name: "Simulation Data Analysis Tool"
|
||||
displayOrder: 2
|
||||
---
|
@@ -1,5 +1,5 @@
|
||||
---
|
||||
associatedExperience: "rivian-2"
|
||||
associatedEntry: "rivian-2"
|
||||
name: "Bill of Materials Analysis"
|
||||
displayOrder: 1
|
||||
---
|
@@ -1,5 +1,5 @@
|
||||
---
|
||||
associatedExperience: "rivian-2"
|
||||
associatedEntry: "rivian-2"
|
||||
name: "Internal Website"
|
||||
displayOrder: 2
|
||||
---
|
@@ -1,5 +1,5 @@
|
||||
---
|
||||
associatedExperience: "rivian-2"
|
||||
associatedEntry: "rivian-2"
|
||||
name: "IT Service Desk"
|
||||
displayOrder: 3
|
||||
---
|
@@ -1,5 +1,5 @@
|
||||
---
|
||||
associatedExperience: "rivian-3"
|
||||
associatedEntry: "rivian-3"
|
||||
name: "Model-In-Loop Test Case Generation"
|
||||
displayOrder: 1
|
||||
---
|
@@ -1,5 +1,5 @@
|
||||
---
|
||||
associatedExperience: "rivian-3"
|
||||
associatedEntry: "rivian-3"
|
||||
name: "Simulink Software Integration"
|
||||
displayOrder: 2
|
||||
---
|
@@ -1,5 +1,5 @@
|
||||
---
|
||||
associatedExperience: "rivian-3"
|
||||
associatedEntry: "rivian-3"
|
||||
name: "Testing Data Processing"
|
||||
displayOrder: 3
|
||||
---
|
@@ -1,11 +1,11 @@
|
||||
---
|
||||
displayOrder: 3
|
||||
id: "hughes-1"
|
||||
companyUrl: "https://www.hughes.com"
|
||||
companyLogo: "/assets/professional_experience/logo-hughes.jpg"
|
||||
companyName: "Hughes Network Systems"
|
||||
jobTitle: "Software Development Intern"
|
||||
workLocation: "San Diego, CA"
|
||||
url: "https://www.hughes.com"
|
||||
logo: "/assets/professional_experience/logo-hughes.jpg"
|
||||
association: "Hughes Network Systems"
|
||||
entryTitle: "Software Development Intern"
|
||||
location: "San Diego, CA"
|
||||
startDate: "May 20, 2019"
|
||||
endDate: "August 23, 2019"
|
||||
---
|
||||
|
@@ -1,10 +1,11 @@
|
||||
---
|
||||
displayOrder: 8
|
||||
companyUrl: "https://www.metsci.com"
|
||||
companyLogo: "/assets/professional_experience/logo-metron.jpeg"
|
||||
companyName: "Metron"
|
||||
jobTitle: "Software Engineer I"
|
||||
workLocation: "Reston, VA"
|
||||
id: "metron-1"
|
||||
url: "https://www.metsci.com"
|
||||
logo: "/assets/professional_experience/logo-metron.jpeg"
|
||||
assocation: "Metron"
|
||||
entryTitle: "Software Engineer I"
|
||||
location: "Reston, VA"
|
||||
startDate: "April 3, 2023"
|
||||
endDate: "Present"
|
||||
---
|
@@ -1,11 +1,11 @@
|
||||
---
|
||||
displayOrder: 5
|
||||
id: "mitre-1"
|
||||
companyUrl: "https://www.mitre.org"
|
||||
companyLogo: "/assets/professional_experience/logo-mitre.jpeg"
|
||||
companyName: "MITRE"
|
||||
jobTitle: "Graduate Navigation Intern"
|
||||
workLocation: "Remote"
|
||||
url: "https://www.mitre.org"
|
||||
logo: "/assets/professional_experience/logo-mitre.jpeg"
|
||||
association: "MITRE"
|
||||
entryTitle: "Graduate Navigation Intern"
|
||||
location: "Remote"
|
||||
startDate: "May 10, 2021"
|
||||
endDate: "August 20, 2021"
|
||||
---
|
||||
|
@@ -1,11 +1,11 @@
|
||||
---
|
||||
displayOrder: 6
|
||||
id: "mitre-2"
|
||||
companyUrl: "https://www.mitre.org"
|
||||
companyLogo: "/assets/professional_experience/logo-mitre.jpeg"
|
||||
companyName: "MITRE"
|
||||
jobTitle: "Associate Autonomous Systems Engineer"
|
||||
workLocation: "McLean, VA"
|
||||
url: "https://www.mitre.org"
|
||||
logo: "/assets/professional_experience/logo-mitre.jpeg"
|
||||
association: "MITRE"
|
||||
entryTitle: "Associate Autonomous Systems Engineer"
|
||||
location: "McLean, VA"
|
||||
startDate: "January 31, 2022"
|
||||
endDate: "September 12, 2022"
|
||||
---
|
@@ -1,12 +1,11 @@
|
||||
---
|
||||
displayOrder: 7
|
||||
id: "mitre-3"
|
||||
companyUrl: "https://www.mitre.org"
|
||||
companyLogo: "/assets/professional_experience/logo-mitre.jpeg"
|
||||
companyName: "MITRE"
|
||||
jobTitle: "Intermediate Autonomous Systems Engineer"
|
||||
workLocation: "McLean, VA"
|
||||
url: "https://www.mitre.org"
|
||||
logo: "/assets/professional_experience/logo-mitre.jpeg"
|
||||
association: "MITRE"
|
||||
entryTitle: "Intermediate Autonomous Systems Engineer"
|
||||
location: "McLean, VA"
|
||||
startDate: "September 12, 2022"
|
||||
endDate: "March 31, 2023"
|
||||
---
|
||||
|
||||
|
@@ -1,11 +1,11 @@
|
||||
---
|
||||
displayOrder: 1
|
||||
id: "rivian-1"
|
||||
companyUrl: "https://rivian.com"
|
||||
companyLogo: "/assets/professional_experience/logo-rivian.png"
|
||||
companyName: "Rivian"
|
||||
jobTitle: "Vehicle Integration Intern"
|
||||
workLocation: "Livonia, MI"
|
||||
url: "https://rivian.com"
|
||||
logo: "/assets/professional_experience/logo-rivian.png"
|
||||
association: "Rivian"
|
||||
entryTitle: "Vehicle Integration Intern"
|
||||
location: "Livonia, MI"
|
||||
startDate: "May 30, 2017"
|
||||
endDate: "August 25, 2017"
|
||||
---
|
||||
|
@@ -1,11 +1,11 @@
|
||||
---
|
||||
displayOrder: 2
|
||||
id: "rivian-2"
|
||||
companyUrl: "https://rivian.com"
|
||||
companyLogo: "/assets/professional_experience/logo-rivian.png"
|
||||
companyName: "Rivian"
|
||||
jobTitle: "Business Technology Intern"
|
||||
workLocation: "Plymouth, MI"
|
||||
url: "https://rivian.com"
|
||||
logo: "/assets/professional_experience/logo-rivian.png"
|
||||
association: "Rivian"
|
||||
entryTitle: "Business Technology Intern"
|
||||
location: "Plymouth, MI"
|
||||
startDate: "May 7, 2018"
|
||||
endDate: "December 7, 2018"
|
||||
---
|
||||
|
@@ -1,11 +1,11 @@
|
||||
---
|
||||
displayOrder: 4
|
||||
id: "rivian-3"
|
||||
companyUrl: "https://rivian.com"
|
||||
companyLogo: "/assets/professional_experience/logo-rivian.png"
|
||||
companyName: "Rivian"
|
||||
jobTitle: "ADAS Controls Intern"
|
||||
workLocation: "Remote"
|
||||
url: "https://rivian.com"
|
||||
logo: "/assets/professional_experience/logo-rivian.png"
|
||||
association: "Rivian"
|
||||
entryTitle: "ADAS Controls Intern"
|
||||
location: "Remote"
|
||||
startDate: "June 1, 2020"
|
||||
endDate: "August 21, 2020"
|
||||
---
|
||||
|
Reference in New Issue
Block a user