Skip to content

Dev#354

Closed
DinneK wants to merge 194 commits into
mainfrom
dev
Closed

Dev#354
DinneK wants to merge 194 commits into
mainfrom
dev

Conversation

@DinneK
Copy link
Copy Markdown
Contributor

@DinneK DinneK commented Apr 7, 2025

module-name: All Front-End Updates Currently in Dev

Problem

  • Current main branch lacks css enhancements for responsiveness
  • Change environmental configurations
  • URL generation is hard coded, limiting deployment flexibility

Solution

This merge includes:

  • CSS responsiveness solutions
  • Core functionality
  • Configuration changes

Result

  • Supports custom domains
  • Better mobile experience
  • More modular makeup

Test Plan

Visual testing

@DinneK DinneK requested a review from decause-gov April 7, 2025 13:51
@DinneK DinneK self-assigned this Apr 7, 2025
Comment thread app/src/js/modules/events.js
Comment thread app/src/js/modules/sorting.js
Comment thread app/src/js/modules/sorting.js
Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

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

Remaining comments which cannot be posted as a review comment to avoid GitHub Rate Limit

prettier

[prettier] reported by reviewdog 🐶

const filtersButtonGroup = document.createElement('div');
filtersButtonGroup.className = "usa-button-group";
selectedFiltersContainer.appendChild(filtersButtonGroup);


[prettier] reported by reviewdog 🐶

const filtersArray = selectedFiltersObject[filterCategory];
filtersArray.forEach(filter => {


[prettier] reported by reviewdog 🐶

const filterButton = document.createElement('button');
filterButton.className = 'usa-button margin-bottom-1';
filterButton.textContent = filter;
filtersButtonGroup.appendChild(filterButton);


[prettier] reported by reviewdog 🐶

addGlobalEventListener("click", "#filter-tags .usa-button", e => {
const buttonName = e.target.textContent;
const selectedCheckboxes = document.querySelectorAll("input:checked");
selectedCheckboxes.forEach(checkbox => {
if (buttonName == checkbox.value) {
e.target.remove();
checkbox.checked = false;
updateFilters();
}
})
}, filtersButtonGroup);


[prettier] reported by reviewdog 🐶

projectType: []


[prettier] reported by reviewdog 🐶

document.querySelectorAll('input[name="org-filter"]:checked').forEach(checkbox => {
selectedFiltersObject.organization.push(checkbox.value);
});
document.querySelectorAll('input[name="tier-filter"]:checked').forEach(checkbox => {
selectedFiltersObject.maturityModelTier.push(checkbox.value);
});
document.querySelectorAll('input[name="fisma-level-filter"]:checked').forEach(checkbox => {
selectedFiltersObject.fismaLevel.push(checkbox.value);
});
document.querySelectorAll('input[name="project-type-filter"]:checked').forEach(checkbox => {
selectedFiltersObject.projectType.push(checkbox.value);
});


[prettier] reported by reviewdog 🐶

const projectSections = document.querySelectorAll(".project_section");


[prettier] reported by reviewdog 🐶

const projectCards = section.querySelectorAll(".project-card");


[prettier] reported by reviewdog 🐶

checkFilterCriteria(card, selectedFiltersObject);


[prettier] reported by reviewdog 🐶

updateHeadingVisibility();


[prettier] reported by reviewdog 🐶

const cardName = card.querySelector(".usa-card__heading").innerText;
const currentProject = parsedProjectsData.find((project) => project.name === cardName)
const matchesOrganization = selectedFiltersObject.organization.length === 0 || selectedFiltersObject.organization.includes(currentProject.owner);
const projectMaturityModelTier = "Tier " + currentProject.maturityModelTier;
const matchesMaturityModelTier = selectedFiltersObject.maturityModelTier.length === 0 || selectedFiltersObject.maturityModelTier.includes(projectMaturityModelTier);
const matchesFismaLevel = selectedFiltersObject.fismaLevel.length === 0 || selectedFiltersObject.fismaLevel.includes(currentProject.fismaLevel);
const matchesProjectType = selectedFiltersObject.projectType.length === 0 || selectedFiltersObject.projectType.includes(currentProject.projectType);


[prettier] reported by reviewdog 🐶

card.hidden = !(matchesOrganization && matchesMaturityModelTier && matchesFismaLevel && matchesProjectType);


[prettier] reported by reviewdog 🐶

const totalProjects = (filteredProjects || parsedProjectsData).length;
const totalPages = Math.ceil(totalProjects / itemsPerPage);


[prettier] reported by reviewdog 🐶

currentPage = Math.min(currentPage, totalPages || 1);
renderPaginationControls(totalPages);
}


[prettier] reported by reviewdog 🐶

import { reportHeadingTemplate, projectCardTemplate } from "../templates";
import { templateDiv, parsedProjectsData, orgsData, siteData, findObject, baseurl } from "./data";
import { updateFilters } from "./filters";
import { getPageRange, updateHeadingVisibility } from "./utilities";
import DOMPurify from 'dompurify';


[prettier] reported by reviewdog 🐶

const itemsPerPage = 10;


[prettier] reported by reviewdog 🐶

let filteredProjects = [...parsedProjectsData];
templateDiv.innerHTML = ''
const allProjects = (filteredProjects || parsedProjectsData).map((project) => ({


[prettier] reported by reviewdog 🐶

org: project.owner
}));
const startIndex = (currentPage - 1) * itemsPerPage;
const endIndex = startIndex + itemsPerPage;
const paginatedProjects = allProjects.slice(startIndex, endIndex);
const groupedByOrg = paginatedProjects.reduce((acc, curr) => {
if(!acc[curr.org]) {
acc[curr.org] = []
}
acc[curr.org].push(curr);
return acc
}, {});
for (const org in groupedByOrg) {
const orgProject = findObject(parsedOrgsData, org);
const orgHeading = reportHeadingTemplate(orgProject);
const projectSectionsTemplate = document.createElement('div');
projectSectionsTemplate.className = 'project_section';
templateDiv.append(projectSectionsTemplate);
const reportHeading = document.createElement('div');
reportHeading.className = "report_heading";
reportHeading.innerHTML = DOMPurify.sanitize(orgHeading);
projectSectionsTemplate.appendChild(reportHeading);
const projectCards = document.createElement('ul');
projectCards.className = "usa-card-group flex-align-stretch";
projectSectionsTemplate.appendChild(projectCards);
groupedByOrg[org].forEach(repoData => {
repoData.baseurl = siteData.baseurl;
const projectCard = document.createElement('li');
projectCard.className = 'usa-card project-card tablet:grid-col-12';
projectCard.id = repoData.name;
projectCard.setAttribute('org-name', repoData.owner);
projectCard.innerHTML = DOMPurify.sanitize(projectCardTemplate(repoData));
projectCards.appendChild(projectCard);
})


[prettier] reported by reviewdog 🐶

updateFilters();
updateHeadingVisibility();
renderPaginationControls(allProjects.length)


[prettier] reported by reviewdog 🐶


[prettier] reported by reviewdog 🐶

const startIndex = (currentPage - 1) * itemsPerPage;
const endIndex = startIndex + itemsPerPage;
const paginatedProjects = projects.slice(startIndex, endIndex);


[prettier] reported by reviewdog 🐶

templateDiv.innerHTML = '';


[prettier] reported by reviewdog 🐶

if(!acc[curr.owner]) {


[prettier] reported by reviewdog 🐶

acc[curr.owner].push(curr);


[prettier] reported by reviewdog 🐶


[prettier] reported by reviewdog 🐶

const orgProject = findObject(parsedOrgsData, org);
const orgHeading = reportHeadingTemplate(orgProject);
const projectSectionsTemplate = document.createElement('div');
projectSectionsTemplate.className = 'project_section';
const reportHeading = document.createElement('div');
reportHeading.className = "report_heading";
reportHeading.innerHTML = DOMPurify.sanitize(orgHeading);
projectSectionsTemplate.appendChild(reportHeading);
const projectCards = document.createElement('ul');
projectCards.className = "usa-card-group flex-align-stretch";
groupedByOrg[org].forEach(repoData => {
repoData.baseurl = siteData.baseurl;
const projectCard = document.createElement('li');
projectCard.className = 'usa-card project-card tablet:grid-col-12';
projectCard.id = repoData.name;
projectCard.setAttribute('org-name', repoData.owner);
projectCard.innerHTML = DOMPurify.sanitize(projectCardTemplate(repoData));
projectCards.appendChild(projectCard);
});
projectSectionsTemplate.appendChild(projectCards);
templateDiv.append(projectSectionsTemplate);


[prettier] reported by reviewdog 🐶

updateHeadingVisibility();


[prettier] reported by reviewdog 🐶

const paginationDiv = document.getElementById('pagination-controls') || document.createElement('div');
paginationDiv.id = 'pagination-controls';
paginationDiv.className = 'usa-pagination';
paginationDiv.innerHTML = '';
const totalPages = Math.ceil(totalProjectsCount / itemsPerPage);
const paginationList = document.createElement('ul');
paginationList.className = 'usa-pagination__list';
const prevItem = document.createElement('li');
prevItem.className = 'usa-pagination__item usa-pagination__arrow';
const prevButton = document.createElement('a');
prevButton.href = 'javascript:void(0);';
prevButton.className = 'usa-pagination__link usa-pagination__previous-page';
prevButton.setAttribute('aria-label', 'Previous page');
if (currentPage === 1) prevButton.classList.add('usa-pagination__disabled');


[prettier] reported by reviewdog 🐶

`;
prevButton.addEventListener('click', () => {


[prettier] reported by reviewdog 🐶

currentPage--;
createProjectCards();


[prettier] reported by reviewdog 🐶

});
prevItem.appendChild(prevButton);
paginationList.appendChild(prevItem);


[prettier] reported by reviewdog 🐶

const pageRange = getPageRange(currentPage, totalPages, 3);


[prettier] reported by reviewdog 🐶

const pageItem = document.createElement('li');
pageItem.className = 'usa-pagination__item';


[prettier] reported by reviewdog 🐶

if (page === '...') {
pageItem.className += ' usa-pagination__overflow';
pageItem.innerHTML = `<span aria-label="ellipsis indicating non-visible pages">…</span>`;


[prettier] reported by reviewdog 🐶

pageItem.className += ' usa-pagination__page-no';
const pageButton = document.createElement('a');
pageButton.href = 'javascript:void(0);';
pageButton.className = `usa-pagination__button${page === currentPage ? ' usa-current' : ''}`;
pageButton.textContent = page;
pageButton.setAttribute('aria-label', `Page ${page}`);
if (page === currentPage) pageButton.setAttribute('aria-current', 'page');
pageButton.addEventListener('click', () => {
currentPage = page;
createProjectCards();
});
pageItem.appendChild(pageButton);


[prettier] reported by reviewdog 🐶

paginationList.appendChild(pageItem);
});
const nextItem = document.createElement('li');
nextItem.className = 'usa-pagination__item usa-pagination__arrow';
const nextButton = document.createElement('a');
nextButton.href = 'javascript:void(0);';
nextButton.className = 'usa-pagination__link usa-pagination__next-page';
nextButton.setAttribute('aria-label', 'Next page');
if (currentPage === totalPages) nextButton.classList.add('usa-pagination__disabled');


[prettier] reported by reviewdog 🐶

`;
nextButton.addEventListener('click', () => {


[prettier] reported by reviewdog 🐶

currentPage++;
createProjectCards();


[prettier] reported by reviewdog 🐶

});
nextItem.appendChild(nextButton);
paginationList.appendChild(nextItem);


[prettier] reported by reviewdog 🐶

paginationDiv.appendChild(paginationList);


[prettier] reported by reviewdog 🐶

templateDiv.parentElement.appendChild(paginationDiv);


[prettier] reported by reviewdog 🐶

import { sortSelection, parsedProjectsData, filtersContainer } from "./data";
import { addGlobalEventListener } from "./utilities";
import { updateFilters, updateFilteredProjects, updatePagination } from "./filters";
import { renderPaginatedProjects } from "./rendering";


[prettier] reported by reviewdog 🐶

const selection = sortSelection.value;


[prettier] reported by reviewdog 🐶

if(["maturity_model_tier", "stargazers_count", "forks_count"].includes(selection)) {
sortByNumberAttribute(targetProjects, selection, isDescending);
} else {
sortByStringAttribute(targetProjects, selection, isDescending);


[prettier] reported by reviewdog 🐶

updatePagination();
renderPaginatedProjects(filteredProjects);


[prettier] reported by reviewdog 🐶

const attributeA = a[attribute] !== undefined ? Number(a[attribute]) : Infinity;
const attributeB = b[attribute] !== undefined ? Number(b[attribute]) : Infinity;
return isDescending ? attributeB - attributeA : attributeA - attributeB;
});


[prettier] reported by reviewdog 🐶

const hasAttributeA = typeof a[attribute] === 'string';
const hasAttributeB = typeof b[attribute] === 'string';


[prettier] reported by reviewdog 🐶

return isDescending ? b[attribute].localeCompare(a[attribute]) : a[attribute].localeCompare(b[attribute]);


[prettier] reported by reviewdog 🐶

// If only one object has the attribute, determine order based on `isDescending`
if (hasAttributeA) return isDescending ? 1 : -1;
if (hasAttributeB) return isDescending ? -1 : 1;


[prettier] reported by reviewdog 🐶

return isDescending ? b.name.localeCompare(a.name) : a.name.localeCompare(b.name);
});


[prettier] reported by reviewdog 🐶

addGlobalEventListener('change', '.usa-checkbox__input', e => {


[prettier] reported by reviewdog 🐶

updateFilters();


[prettier] reported by reviewdog 🐶

}, filtersContainer)


[prettier] reported by reviewdog 🐶

export function addGlobalEventListener(type, selector, callback, parent = document) {
parent.addEventListener(type, e => {


[prettier] reported by reviewdog 🐶


[prettier] reported by reviewdog 🐶


[prettier] reported by reviewdog 🐶

const range = [];
const start = Math.max(2, currentPage - visibleRange);
const end = Math.min(totalPages - 1, currentPage + visibleRange);


[prettier] reported by reviewdog 🐶


[prettier] reported by reviewdog 🐶

if (start > 2) range.push('...');


[prettier] reported by reviewdog 🐶


[prettier] reported by reviewdog 🐶

if (end < totalPages - 1) range.push('...');


[prettier] reported by reviewdog 🐶

if (totalPages > 1) range.push(totalPages);


[prettier] reported by reviewdog 🐶


[prettier] reported by reviewdog 🐶

const projectSections = document.querySelectorAll(".project_section");
projectSections.forEach(section => {
let hasVisibleCard = false;


[prettier] reported by reviewdog 🐶

let reportHeading = section.querySelector('.report_heading');


[prettier] reported by reviewdog 🐶

let projectCards = section.querySelectorAll('.project-card');


[prettier] reported by reviewdog 🐶

hasVisibleCard = true;


[prettier] reported by reviewdog 🐶

// Hide heading if all cards under section are hidden
reportHeading.hidden = !hasVisibleCard;
});


[prettier] reported by reviewdog 🐶

import { createProjectCards } from "./modules/rendering";
import { setupEventListeners } from './modules/events';
import { baseurl } from './modules/data';


[prettier] reported by reviewdog 🐶

const filterButtons = document.querySelectorAll(".usa-accordion__button");
const isMobile = window.innerWidth < 768;


[prettier] reported by reviewdog 🐶

const contentId = button.getAttribute("aria-controls");
const content = document.getElementById(contentId);
const icon = button.querySelector("svg use");
if(isMobile) {
button.setAttribute("aria-expanded", "false");
content.setAttribute("hidden", "true");
icon.setAttribute("href", `${baseurl}/assets/img/sprite.svg#expand_more`);


[prettier] reported by reviewdog 🐶

button.setAttribute("aria-expanded", "true");
content.removeAttribute("hidden");
icon.setAttribute("href", `${baseurl}/assets/img/sprite.svg#expand_less`);


[prettier] reported by reviewdog 🐶

const expanded = button.getAttribute("aria-expanded");
const content = document.getElementById(button.getAttribute("id"));
const icon = button.querySelector("svg use");


[prettier] reported by reviewdog 🐶

if(expanded === 'false') {
content.removeAttribute("hidden");
icon.setAttribute("href", `${baseurl}/assets/img/sprite.svg#expand_less`);


[prettier] reported by reviewdog 🐶

content.setAttribute("hidden", "true");
icon.setAttribute("href", `${baseurl}/assets/img/sprite.svg#expand_more`);


[prettier] reported by reviewdog 🐶

});
});
});


[prettier] reported by reviewdog 🐶

export const reportHeadingTemplate = function(data) {
return `

Comment thread app/.eleventy.js
Comment thread app/src/css/style.css
Comment thread app/src/css/style.css
Comment thread app/src/css/style.css
Comment thread app/src/css/style.css
Comment thread app/src/js/modules/data.js
Comment thread app/src/js/modules/data.js
Comment thread app/src/js/modules/data.js
Comment thread app/src/js/modules/data.js
Comment thread app/src/js/modules/filters.js
Comment thread app/src/js/modal.js
DinneK and others added 3 commits April 8, 2025 17:36
Signed-off-by: Dinne Kopelevich <dinne.kopelevich@gsa.gov>
Signed-off-by: Dinne Kopelevich <dinne.kopelevich@gsa.gov>
Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

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

Remaining comments which cannot be posted as a review comment to avoid GitHub Rate Limit

prettier

[prettier] reported by reviewdog 🐶

});
prevItem.appendChild(prevButton);
paginationList.appendChild(prevItem);


[prettier] reported by reviewdog 🐶

const pageRange = getPageRange(currentPage, totalPages, 3);


[prettier] reported by reviewdog 🐶

const pageItem = document.createElement('li');
pageItem.className = 'usa-pagination__item';


[prettier] reported by reviewdog 🐶

if (page === '...') {
pageItem.className += ' usa-pagination__overflow';
pageItem.innerHTML = `<span aria-label="ellipsis indicating non-visible pages">…</span>`;


[prettier] reported by reviewdog 🐶

pageItem.className += ' usa-pagination__page-no';
const pageButton = document.createElement('a');
pageButton.href = 'javascript:void(0);';
pageButton.className = `usa-pagination__button${page === currentPage ? ' usa-current' : ''}`;
pageButton.textContent = page;
pageButton.setAttribute('aria-label', `Page ${page}`);
if (page === currentPage) pageButton.setAttribute('aria-current', 'page');
pageButton.addEventListener('click', () => {
currentPage = page;
createProjectCards();
});
pageItem.appendChild(pageButton);


[prettier] reported by reviewdog 🐶

paginationList.appendChild(pageItem);
});
const nextItem = document.createElement('li');
nextItem.className = 'usa-pagination__item usa-pagination__arrow';
const nextButton = document.createElement('a');
nextButton.href = 'javascript:void(0);';
nextButton.className = 'usa-pagination__link usa-pagination__next-page';
nextButton.setAttribute('aria-label', 'Next page');
if (currentPage === totalPages) nextButton.classList.add('usa-pagination__disabled');


[prettier] reported by reviewdog 🐶

`;
nextButton.addEventListener('click', () => {


[prettier] reported by reviewdog 🐶

currentPage++;
createProjectCards();


[prettier] reported by reviewdog 🐶

});
nextItem.appendChild(nextButton);
paginationList.appendChild(nextItem);


[prettier] reported by reviewdog 🐶

paginationDiv.appendChild(paginationList);


[prettier] reported by reviewdog 🐶

templateDiv.parentElement.appendChild(paginationDiv);


[prettier] reported by reviewdog 🐶

import { sortSelection, parsedProjectsData, filtersContainer } from "./data";
import { addGlobalEventListener } from "./utilities";
import { updateFilters, updateFilteredProjects, updatePagination } from "./filters";
import { renderPaginatedProjects } from "./rendering";


[prettier] reported by reviewdog 🐶

const selection = sortSelection.value;


[prettier] reported by reviewdog 🐶

if(["maturity_model_tier", "stargazers_count", "forks_count"].includes(selection)) {
sortByNumberAttribute(targetProjects, selection, isDescending);
} else {
sortByStringAttribute(targetProjects, selection, isDescending);


[prettier] reported by reviewdog 🐶

updatePagination();
renderPaginatedProjects(filteredProjects);


[prettier] reported by reviewdog 🐶

const attributeA = a[attribute] !== undefined ? Number(a[attribute]) : Infinity;
const attributeB = b[attribute] !== undefined ? Number(b[attribute]) : Infinity;
return isDescending ? attributeB - attributeA : attributeA - attributeB;
});


[prettier] reported by reviewdog 🐶

const hasAttributeA = typeof a[attribute] === 'string';
const hasAttributeB = typeof b[attribute] === 'string';


[prettier] reported by reviewdog 🐶

return isDescending ? b[attribute].localeCompare(a[attribute]) : a[attribute].localeCompare(b[attribute]);


[prettier] reported by reviewdog 🐶

// If only one object has the attribute, determine order based on `isDescending`
if (hasAttributeA) return isDescending ? 1 : -1;
if (hasAttributeB) return isDescending ? -1 : 1;


[prettier] reported by reviewdog 🐶

return isDescending ? b.name.localeCompare(a.name) : a.name.localeCompare(b.name);
});


[prettier] reported by reviewdog 🐶

addGlobalEventListener('change', '.usa-checkbox__input', e => {


[prettier] reported by reviewdog 🐶

updateFilters();


[prettier] reported by reviewdog 🐶

}, filtersContainer)


[prettier] reported by reviewdog 🐶

export function addGlobalEventListener(type, selector, callback, parent = document) {
parent.addEventListener(type, e => {


[prettier] reported by reviewdog 🐶


[prettier] reported by reviewdog 🐶


[prettier] reported by reviewdog 🐶

const range = [];
const start = Math.max(2, currentPage - visibleRange);
const end = Math.min(totalPages - 1, currentPage + visibleRange);


[prettier] reported by reviewdog 🐶


[prettier] reported by reviewdog 🐶

if (start > 2) range.push('...');


[prettier] reported by reviewdog 🐶


[prettier] reported by reviewdog 🐶

if (end < totalPages - 1) range.push('...');


[prettier] reported by reviewdog 🐶

if (totalPages > 1) range.push(totalPages);


[prettier] reported by reviewdog 🐶


[prettier] reported by reviewdog 🐶

const projectSections = document.querySelectorAll(".project_section");
projectSections.forEach(section => {
let hasVisibleCard = false;


[prettier] reported by reviewdog 🐶

let reportHeading = section.querySelector('.report_heading');


[prettier] reported by reviewdog 🐶

let projectCards = section.querySelectorAll('.project-card');


[prettier] reported by reviewdog 🐶

hasVisibleCard = true;


[prettier] reported by reviewdog 🐶

// Hide heading if all cards under section are hidden
reportHeading.hidden = !hasVisibleCard;
});


[prettier] reported by reviewdog 🐶

import { createProjectCards } from "./modules/rendering";
import { setupEventListeners } from './modules/events';
import { baseurl } from './modules/data';


[prettier] reported by reviewdog 🐶

const filterButtons = document.querySelectorAll(".usa-accordion__button");
const isMobile = window.innerWidth < 768;


[prettier] reported by reviewdog 🐶

const contentId = button.getAttribute("aria-controls");
const content = document.getElementById(contentId);
const icon = button.querySelector("svg use");
if(isMobile) {
button.setAttribute("aria-expanded", "false");
content.setAttribute("hidden", "true");
icon.setAttribute("href", `${baseurl}/assets/img/sprite.svg#expand_more`);


[prettier] reported by reviewdog 🐶

button.setAttribute("aria-expanded", "true");
content.removeAttribute("hidden");
icon.setAttribute("href", `${baseurl}/assets/img/sprite.svg#expand_less`);


[prettier] reported by reviewdog 🐶

const expanded = button.getAttribute("aria-expanded");
const content = document.getElementById(button.getAttribute("id"));
const icon = button.querySelector("svg use");


[prettier] reported by reviewdog 🐶

if(expanded === 'false') {
content.removeAttribute("hidden");
icon.setAttribute("href", `${baseurl}/assets/img/sprite.svg#expand_less`);


[prettier] reported by reviewdog 🐶

content.setAttribute("hidden", "true");
icon.setAttribute("href", `${baseurl}/assets/img/sprite.svg#expand_more`);


[prettier] reported by reviewdog 🐶

});
});
});


[prettier] reported by reviewdog 🐶

export const reportHeadingTemplate = function(data) {
return `

Comment thread app/src/js/modules/rendering.js
Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

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

Remaining comments which cannot be posted as a review comment to avoid GitHub Rate Limit

prettier

[prettier] reported by reviewdog 🐶

if (end < totalPages - 1) range.push('...');


[prettier] reported by reviewdog 🐶

if (totalPages > 1) range.push(totalPages);


[prettier] reported by reviewdog 🐶


[prettier] reported by reviewdog 🐶

const projectSections = document.querySelectorAll(".project_section");
projectSections.forEach(section => {
let hasVisibleCard = false;


[prettier] reported by reviewdog 🐶

let reportHeading = section.querySelector('.report_heading');


[prettier] reported by reviewdog 🐶

let projectCards = section.querySelectorAll('.project-card');


[prettier] reported by reviewdog 🐶

hasVisibleCard = true;


[prettier] reported by reviewdog 🐶

// Hide heading if all cards under section are hidden
reportHeading.hidden = !hasVisibleCard;
});


[prettier] reported by reviewdog 🐶

import { createProjectCards } from "./modules/rendering";
import { setupEventListeners } from './modules/events';
import { baseurl } from './modules/data';


[prettier] reported by reviewdog 🐶

const filterButtons = document.querySelectorAll(".usa-accordion__button");
const isMobile = window.innerWidth < 768;


[prettier] reported by reviewdog 🐶

const contentId = button.getAttribute("aria-controls");
const content = document.getElementById(contentId);
const icon = button.querySelector("svg use");
if(isMobile) {
button.setAttribute("aria-expanded", "false");
content.setAttribute("hidden", "true");
icon.setAttribute("href", `${baseurl}/assets/img/sprite.svg#expand_more`);


[prettier] reported by reviewdog 🐶

button.setAttribute("aria-expanded", "true");
content.removeAttribute("hidden");
icon.setAttribute("href", `${baseurl}/assets/img/sprite.svg#expand_less`);


[prettier] reported by reviewdog 🐶

const expanded = button.getAttribute("aria-expanded");
const content = document.getElementById(button.getAttribute("id"));
const icon = button.querySelector("svg use");


[prettier] reported by reviewdog 🐶

if(expanded === 'false') {
content.removeAttribute("hidden");
icon.setAttribute("href", `${baseurl}/assets/img/sprite.svg#expand_less`);


[prettier] reported by reviewdog 🐶

content.setAttribute("hidden", "true");
icon.setAttribute("href", `${baseurl}/assets/img/sprite.svg#expand_more`);


[prettier] reported by reviewdog 🐶

});
});
});


[prettier] reported by reviewdog 🐶

export const reportHeadingTemplate = function(data) {
return `

Comment thread app/src/js/modules/sorting.js
Comment thread app/src/js/modules/sorting.js
Comment thread app/src/js/modules/sorting.js
Comment thread app/src/js/modules/sorting.js
Comment thread app/src/js/modules/sorting.js
Comment thread app/src/js/modules/utilities.js
Comment thread app/src/js/modules/utilities.js
Comment thread app/src/js/modules/utilities.js
Comment thread app/src/js/modules/utilities.js
Comment thread app/src/js/modules/utilities.js
Comment thread app/src/js/modules/utilities.js
Comment thread app/src/js/modules/utilities.js
Comment thread app/src/js/modules/utilities.js
Comment thread app/src/js/modules/utilities.js
Comment thread app/src/js/modules/utilities.js
Comment thread app/src/js/projects.js
Comment thread app/src/js/projects.js
Comment thread app/src/js/projects.js
Comment thread app/src/js/projects.js
Comment thread app/src/js/templates.js
Comment thread app/src/js/modules/events.js
Comment thread app/src/js/modules/rendering.js
Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

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

Remaining comments which cannot be posted as a review comment to avoid GitHub Rate Limit

prettier

[prettier] reported by reviewdog 🐶

checkFilterCriteria(card, selectedFiltersObject);


[prettier] reported by reviewdog 🐶

updateHeadingVisibility();


[prettier] reported by reviewdog 🐶

const cardName = card.querySelector(".usa-card__heading").innerText;
const currentProject = parsedProjectsData.find((project) => project.name === cardName)
const matchesOrganization = selectedFiltersObject.organization.length === 0 || selectedFiltersObject.organization.includes(currentProject.owner);
const projectMaturityModelTier = "Tier " + currentProject.maturityModelTier;
const matchesMaturityModelTier = selectedFiltersObject.maturityModelTier.length === 0 || selectedFiltersObject.maturityModelTier.includes(projectMaturityModelTier);
const matchesFismaLevel = selectedFiltersObject.fismaLevel.length === 0 || selectedFiltersObject.fismaLevel.includes(currentProject.fismaLevel);
const matchesProjectType = selectedFiltersObject.projectType.length === 0 || selectedFiltersObject.projectType.includes(currentProject.projectType);


[prettier] reported by reviewdog 🐶

card.hidden = !(matchesOrganization && matchesMaturityModelTier && matchesFismaLevel && matchesProjectType);


[prettier] reported by reviewdog 🐶

const totalProjects = (filteredProjects || parsedProjectsData).length;
const totalPages = Math.ceil(totalProjects / itemsPerPage);


[prettier] reported by reviewdog 🐶

currentPage = Math.min(currentPage, totalPages || 1);
renderPaginationControls(totalPages);
}


[prettier] reported by reviewdog 🐶

import { reportHeadingTemplate, projectCardTemplate } from "../templates";
import { templateDiv, parsedProjectsData, orgsData, siteData, findObject, baseurl } from "./data";
import { getFilteredProjects, updateFilters } from "./filters";
import { getPageRange, updateHeadingVisibility } from "./utilities";
import DOMPurify from 'dompurify';


[prettier] reported by reviewdog 🐶

templateDiv.innerHTML = ''
const allProjects = (projects || parsedProjectsData).map((project) => ({
...project,
org: project.owner
}));
const startIndex = (currentPage - 1) * itemsPerPage;
const endIndex = startIndex + itemsPerPage;
const paginatedProjects = allProjects.slice(startIndex, endIndex);
const groupedByOrg = paginatedProjects.reduce((acc, curr) => {
if(!acc[curr.org]) {
acc[curr.org] = []
}
acc[curr.org].push(curr);
return acc
}, {});
for (const org in groupedByOrg) {
const orgProject = findObject(parsedOrgsData, org);
const orgHeading = reportHeadingTemplate(orgProject);
const projectSectionsTemplate = document.createElement('div');
projectSectionsTemplate.className = 'project_section';
templateDiv.append(projectSectionsTemplate);
const reportHeading = document.createElement('div');
reportHeading.className = "report_heading";
reportHeading.innerHTML = DOMPurify.sanitize(orgHeading);
projectSectionsTemplate.appendChild(reportHeading);
const projectCards = document.createElement('ul');
projectCards.className = "usa-card-group flex-align-stretch";
projectSectionsTemplate.appendChild(projectCards);
groupedByOrg[org].forEach(repoData => {
repoData.baseurl = siteData.baseurl;
const projectCard = document.createElement('li');
projectCard.className = 'usa-card project-card tablet:grid-col-12';
projectCard.id = repoData.name;
projectCard.setAttribute('org-name', repoData.owner);
projectCard.innerHTML = DOMPurify.sanitize(projectCardTemplate(repoData));
projectCards.appendChild(projectCard);
})


[prettier] reported by reviewdog 🐶

updateFilters();
updateHeadingVisibility();
renderPaginationControls(allProjects.length)


[prettier] reported by reviewdog 🐶


[prettier] reported by reviewdog 🐶

const startIndex = (currentPage - 1) * itemsPerPage;
const endIndex = startIndex + itemsPerPage;
const paginatedProjects = projects.slice(startIndex, endIndex);


[prettier] reported by reviewdog 🐶

templateDiv.innerHTML = '';


[prettier] reported by reviewdog 🐶

if(!acc[curr.owner]) {


[prettier] reported by reviewdog 🐶

acc[curr.owner].push(curr);


[prettier] reported by reviewdog 🐶


[prettier] reported by reviewdog 🐶

const orgProject = findObject(parsedOrgsData, org);
const orgHeading = reportHeadingTemplate(orgProject);
const projectSectionsTemplate = document.createElement('div');
projectSectionsTemplate.className = 'project_section';
const reportHeading = document.createElement('div');
reportHeading.className = "report_heading";
reportHeading.innerHTML = DOMPurify.sanitize(orgHeading);
projectSectionsTemplate.appendChild(reportHeading);
const projectCards = document.createElement('ul');
projectCards.className = "usa-card-group flex-align-stretch";
groupedByOrg[org].forEach(repoData => {
repoData.baseurl = siteData.baseurl;
const projectCard = document.createElement('li');
projectCard.className = 'usa-card project-card tablet:grid-col-12';
projectCard.id = repoData.name;
projectCard.setAttribute('org-name', repoData.owner);
projectCard.innerHTML = DOMPurify.sanitize(projectCardTemplate(repoData));
projectCards.appendChild(projectCard);
});
projectSectionsTemplate.appendChild(projectCards);
templateDiv.append(projectSectionsTemplate);


[prettier] reported by reviewdog 🐶

updateHeadingVisibility();


[prettier] reported by reviewdog 🐶

const paginationDiv = document.getElementById('pagination-controls') || document.createElement('div');
paginationDiv.id = 'pagination-controls';
paginationDiv.className = 'usa-pagination';
paginationDiv.innerHTML = '';
const totalPages = Math.ceil(totalProjectsCount / itemsPerPage);
const paginationList = document.createElement('ul');
paginationList.className = 'usa-pagination__list';
const prevItem = document.createElement('li');
prevItem.className = 'usa-pagination__item usa-pagination__arrow';
const prevButton = document.createElement('a');
prevButton.href = 'javascript:void(0);';
prevButton.className = 'usa-pagination__link usa-pagination__previous-page';
prevButton.setAttribute('aria-label', 'Previous page');
if (currentPage === 1) prevButton.classList.add('usa-pagination__disabled');


[prettier] reported by reviewdog 🐶

`;
prevButton.addEventListener('click', () => {


[prettier] reported by reviewdog 🐶

currentPage--;
createProjectCards();


[prettier] reported by reviewdog 🐶

});
prevItem.appendChild(prevButton);
paginationList.appendChild(prevItem);


[prettier] reported by reviewdog 🐶

const pageRange = getPageRange(currentPage, totalPages, 3);


[prettier] reported by reviewdog 🐶

const pageItem = document.createElement('li');
pageItem.className = 'usa-pagination__item';


[prettier] reported by reviewdog 🐶

if (page === '...') {
pageItem.className += ' usa-pagination__overflow';
pageItem.innerHTML = `<span aria-label="ellipsis indicating non-visible pages">…</span>`;


[prettier] reported by reviewdog 🐶

pageItem.className += ' usa-pagination__page-no';
const pageButton = document.createElement('a');
pageButton.href = 'javascript:void(0);';
pageButton.className = `usa-pagination__button${page === currentPage ? ' usa-current' : ''}`;
pageButton.textContent = page;
pageButton.setAttribute('aria-label', `Page ${page}`);
if (page === currentPage) pageButton.setAttribute('aria-current', 'page');
pageButton.addEventListener('click', () => {
currentPage = page;
createProjectCards();
});
pageItem.appendChild(pageButton);


[prettier] reported by reviewdog 🐶

paginationList.appendChild(pageItem);
});
const nextItem = document.createElement('li');
nextItem.className = 'usa-pagination__item usa-pagination__arrow';
const nextButton = document.createElement('a');
nextButton.href = 'javascript:void(0);';
nextButton.className = 'usa-pagination__link usa-pagination__next-page';
nextButton.setAttribute('aria-label', 'Next page');
if (currentPage === totalPages) nextButton.classList.add('usa-pagination__disabled');


[prettier] reported by reviewdog 🐶

`;
nextButton.addEventListener('click', () => {


[prettier] reported by reviewdog 🐶

currentPage++;
createProjectCards();


[prettier] reported by reviewdog 🐶

});
nextItem.appendChild(nextButton);
paginationList.appendChild(nextItem);


[prettier] reported by reviewdog 🐶

paginationDiv.appendChild(paginationList);


[prettier] reported by reviewdog 🐶

templateDiv.parentElement.appendChild(paginationDiv);


[prettier] reported by reviewdog 🐶

});
});
});

Comment thread app/src/js/modules/events.js
Comment thread app/src/js/modules/events.js
Comment thread app/src/js/modules/events.js
Comment thread app/src/js/modules/events.js
Comment thread app/src/js/modules/events.js
Comment thread app/src/js/modules/filters.js
Comment thread app/src/js/modules/filters.js
Comment thread app/src/js/modules/filters.js
Comment thread app/src/js/modules/filters.js
Comment thread app/src/js/modules/filters.js
@DinneK DinneK closed this Apr 17, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request front-end javascript Pull requests that update Javascript code metrics

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant