Skip to content

Commit

Permalink
Start reporting validation results in grid validation sheet
Browse files Browse the repository at this point in the history
  • Loading branch information
tidoust committed Feb 19, 2025
1 parent 4e128fa commit f4ebbc7
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 12 deletions.
9 changes: 7 additions & 2 deletions tools/appscript/generate-grid.mjs
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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);
Expand All @@ -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) {
Expand Down
1 change: 1 addition & 0 deletions tools/appscript/project.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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 },
Expand Down
89 changes: 80 additions & 9 deletions tools/appscript/schedule.mjs
Original file line number Diff line number Diff line change
@@ -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 '';
}


Expand Down Expand Up @@ -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;

Expand Down
2 changes: 1 addition & 1 deletion tools/appscript/validate-grid.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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');

Expand Down

0 comments on commit f4ebbc7

Please sign in to comment.