From f4ebbc7fbaedd467b5a1be74d0ee9b2a2a2d0f81 Mon Sep 17 00:00:00 2001 From: Francois Daoust Date: Wed, 19 Feb 2025 10:18:01 +0100 Subject: [PATCH] Start reporting validation results in grid validation sheet --- tools/appscript/generate-grid.mjs | 9 +++- tools/appscript/project.mjs | 1 + tools/appscript/schedule.mjs | 89 +++++++++++++++++++++++++++---- tools/appscript/validate-grid.mjs | 2 +- 4 files changed, 89 insertions(+), 12 deletions(-) diff --git a/tools/appscript/generate-grid.mjs b/tools/appscript/generate-grid.mjs index f204aa0..1b84468 100644 --- a/tools/appscript/generate-grid.mjs +++ b/tools/appscript/generate-grid.mjs @@ -1,6 +1,7 @@ import { getProject } from './project.mjs'; import { fillGridSheet } from './schedule.mjs'; import reportError from './report-error.mjs'; +import { validateGrid } from '../common/validate.mjs'; /** * Generate the grid for the current spreadsheet @@ -13,7 +14,7 @@ export default function () { /** * Generate the grid in the provided spreadsheet */ -function generateGrid(spreadsheet) { +async function generateGrid(spreadsheet) { try { console.log('Read data from spreadsheet...'); const project = getProject(spreadsheet); @@ -23,8 +24,12 @@ function generateGrid(spreadsheet) { } console.log('Read data from spreadsheet... done'); + console.log('Validate the grid...'); + const res = await validateGrid(project, { what: 'everything' }); + console.log('Validate the grid... done'); + console.log('Generate grid sheet...'); - fillGridSheet(spreadsheet, project); + fillGridSheet(spreadsheet, project, res.errors); console.log('Generate grid sheet... done'); } catch(err) { diff --git a/tools/appscript/project.mjs b/tools/appscript/project.mjs index 07e5cb6..903d092 100644 --- a/tools/appscript/project.mjs +++ b/tools/appscript/project.mjs @@ -9,6 +9,7 @@ export function getProjectSheets(spreadsheet) { // These are the sheets we expect to find in the spreadsheet const sheets = { grid: {}, + gridValidation: { titleMatch: /validation/i }, event: { titleMatch: /event/i }, sessions: { titleMatch: /(list|breakouts)/i }, meetings: { titleMatch: /meetings/i }, diff --git a/tools/appscript/schedule.mjs b/tools/appscript/schedule.mjs index 45e6a60..c8b64ab 100644 --- a/tools/appscript/schedule.mjs +++ b/tools/appscript/schedule.mjs @@ -1,24 +1,95 @@ /** * Fill the grid in the provided spreadsheet */ -export function fillGridSheet(spreadsheet, project) { +export function fillGridSheet(spreadsheet, project, validationErrors) { let sheet = project.sheets.grid.sheet; if (!sheet) { sheet = spreadsheet.insertSheet('Grid', spreadsheet.getSheets().length - 1); project.sheets.grid.sheet = sheet; } + console.log('- clear sheet'); sheet.clear(); - console.log('- sheet cleared'); + console.log('- create headers row'); createHeaderRow(sheet, project.rooms); - console.log('- header row created'); + console.log('- create days/slots headers'); createDaySlotColumns(sheet, project.days, project.slots); - console.log('- days/slots headers created'); - addSessions(sheet, project, + console.log('- add sessions to the grid'); + addSessions(sheet, project, validationErrors, spreadsheet.getUrl() + '#gid=' + project.sheets.meetings.sheet.getSheetId()); - console.log('- sessions added to the grid'); + console.log('- add borders'); addBorders(sheet, project); - console.log('- borders added'); - console.log('Generate grid sheet... done'); + fillGridValidationSheet(spreadsheet, project, validationErrors); +} + +/** + * Fill the grid validation sheet + */ +function fillGridValidationSheet(spreadsheet, project, validationErrors) { + let sheet = project.sheets.gridValidation.sheet; + if (!sheet) { + sheet = spreadsheet.insertSheet('Grid validation', + spreadsheet.getSheets().length - 1); + project.sheets.gridValidation.sheet = sheet; + } + console.log('- clear grid validation sheet'); + sheet.clear(); + + const headers = ['Number', 'Title', 'Meetings', 'Errors', 'Warnings']; + sheet.getRange(1, 1, 1, headers.length) + .setFontWeight('bold') + .setVerticalAlignment('middle') + .setValues([headers]) + sheet + .autoResizeColumns(2, headers.length) + .setFrozenRows(1); + console.log('- create headers in grid validation sheet'); + + // TODO: consider reporting "check" messages as well + validationErrors = validationErrors.filter(err => err.severity !== 'check'); + + const values = []; + const sessions = project.sessions.filter(s => + validationErrors.find(err => err.session === s.number)); + for (const session of sessions) { + console.log(`- report grid validation errors for session ${session.number}`); + const errors = validationErrors.filter(err => + err.session === session.number && + err.severity === 'error'); + const warnings = validationErrors.filter(err => + err.session === session.number && + err.severity === 'warning'); + values.push([ + session.number, + session.title, + getMeetingsDescription(session), + getDescription(errors), + getDescription(warnings) + ]); + } + + const range = sheet.getRange(2, 1, values.length, headers.length); + range.setValues(values); +} + + +/** + * Get a description of the given list of errors or warnings suitable for + * display. + */ +function getDescription(errors) { + return errors + .map(error => error.messages.map(msg => `[${error.type}] ${msg}`)) + .flat() + .map(desc => `- ${desc}`) + .join('\n'); +} + + +/** + * Return a description of the session meeting(s) + */ +function getMeetingsDescription(session) { + return ''; } @@ -87,7 +158,7 @@ function isRightAfter(slotAfter, slotBefore, slots) { /** * Add the list of meetings */ -function addSessions(sheet, project, meetingsSheetUrl) { +function addSessions(sheet, project, validationErrors, meetingsSheetUrl) { const startRow = 2; const startCol = 3; diff --git a/tools/appscript/validate-grid.mjs b/tools/appscript/validate-grid.mjs index ad8cfa6..bae2b1e 100644 --- a/tools/appscript/validate-grid.mjs +++ b/tools/appscript/validate-grid.mjs @@ -35,7 +35,7 @@ export default async function () { console.warn(`Save validation results... done`); console.log('Refresh grid view with validation results...'); - fillGridSheet(spreadsheet, project); + fillGridSheet(spreadsheet, project, res.errors); console.log('- TODO: report validation results'); console.log('Refresh grid view with validation results... done');