feat: assessments overview mark as complete

This commit is contained in:
SethBurkart123
2025-06-07 23:49:28 +10:00
parent 841426d7ec
commit ccb4354b26
5 changed files with 669 additions and 285 deletions
@@ -1,29 +1,35 @@
import type { Plugin } from '../../core/types';
import { waitForElm } from '@/seqta/utils/waitForElm';
import { getAssessmentsData } from './api';
import { renderSkeletonLoader, renderErrorState } from './ui';
import styles from './styles.css?inline';
import { delay } from '@/seqta/utils/delay';
import type { Plugin } from "../../core/types";
import { waitForElm } from "@/seqta/utils/waitForElm";
import { getAssessmentsData } from "./api";
import { renderSkeletonLoader, renderErrorState } from "./ui";
import styles from "./styles.css?inline";
import { delay } from "@/seqta/utils/delay";
const assessmentsOverviewPlugin: Plugin<{}> = {
id: 'assessments-overview',
name: 'Assessments Overview',
description: 'Adds an overview option to the assessments page that organizes assessments by status',
version: '1.0.0',
id: "assessments-overview",
name: "Assessments Overview",
description:
"Adds an overview option to the assessments page that organizes assessments by status",
version: "1.0.0",
settings: {},
disableToggle: false,
styles,
run: async () => {
const menu = (await waitForElm('[data-key="assessments"] > .sub > ul', true, 100, 60)) as HTMLElement;
const gridItem = document.createElement('li');
gridItem.className = 'item';
const label = document.createElement('label');
label.textContent = 'Overview';
const menu = (await waitForElm(
'[data-key="assessments"] > .sub > ul',
true,
100,
60,
)) as HTMLElement;
const gridItem = document.createElement("li");
gridItem.className = "item";
const label = document.createElement("label");
label.textContent = "Overview";
gridItem.appendChild(label);
menu.insertBefore(gridItem, menu.children[1] || null);
if (window.location.hash.includes('/assessments/overview')) {
if (window.location.hash.includes("/assessments/overview")) {
loadGridView();
}
@@ -31,42 +37,50 @@ const assessmentsOverviewPlugin: Plugin<{}> = {
e.preventDefault();
loadGridView();
};
gridItem.addEventListener('click', clickHandler);
gridItem.addEventListener("click", clickHandler);
async function loadGridView() {
await delay(1);
window.history.pushState({}, '', '/#?page=/assessments/overview');
const main = document.getElementById('main');
window.history.pushState({}, "", "/#?page=/assessments/overview");
document.title = "Overview ― SEQTA Learn";
const main = document.getElementById("main");
if (!main) return;
// Update navigation state
document.querySelectorAll('[data-key="assessments"] .item').forEach(item => {
item.classList.remove('active');
});
gridItem.classList.add('active');
document.querySelector('[data-key="assessments"]')?.classList.add('active');
// Clear main content and add container
document
.querySelectorAll('[data-key="assessments"] .item')
.forEach((item) => {
item.classList.remove("active");
});
gridItem.classList.add("active");
document
.querySelector('[data-key="assessments"]')
?.classList.add("active");
main.innerHTML = '<div id="grid-view-container"></div>';
const container = document.getElementById('grid-view-container') as HTMLElement;
const container = document.getElementById(
"grid-view-container",
) as HTMLElement;
renderSkeletonLoader(container);
try {
const data = await getAssessmentsData();
const { renderGrid } = await import('./ui');
const { renderGrid } = await import("./ui");
renderGrid(container, data);
} catch (err) {
console.error('Failed to load assessments:', err);
renderErrorState(container, err instanceof Error ? err.message : 'Unknown error');
console.error("Failed to load assessments:", err);
renderErrorState(
container,
err instanceof Error ? err.message : "Unknown error",
);
}
}
return () => {
gridItem.removeEventListener('click', clickHandler);
gridItem.removeEventListener("click", clickHandler);
gridItem.remove();
};
},
};
export default assessmentsOverviewPlugin;
export default assessmentsOverviewPlugin;