Skip to content

Commit e60cdcc

Browse files
committed
Generate schedule in new sheet each time
The update also simplifies the custom menu logic. Validation was moved to the Advanced menu, and the option to re-generate an existing schedule sheet was removed (there should be no need to do that).
1 parent b0f929b commit e60cdcc

File tree

5 files changed

+48
-82
lines changed

5 files changed

+48
-82
lines changed

tools/appscript/add-custom-menu.mjs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,15 @@ export default function () {
1010
.addSubMenu(
1111
SpreadsheetApp.getUi()
1212
.createMenu('Manage the schedule')
13-
.addItem('Validate metadata and existing schedule', 'validateGrid')
14-
.addItem('Validate metadata and propose a new schedule', 'proposeGrid')
13+
.addItem('Propose a new schedule', 'proposeGrid')
1514
.addItem('Apply current schedule sheet', 'applySchedule')
16-
.addItem('Refresh table view of schedule', 'generateGrid')
1715
)
1816
.addItem('Publish the schedule and calendar', 'exportGrid')
1917
.addSeparator()
2018
.addSubMenu(
2119
SpreadsheetApp.getUi()
2220
.createMenu('Advanced')
21+
.addItem('Validate metadata and existing schedule', 'validateGrid')
2322
.addItem('Retrieve latest published schedule (from GitHub)', 'importGrid')
2423
.addItem('Fetch event info, rooms, days, slots (from GitHub)', 'importMetadata')
2524
.addItem('Export event to files (HTML, JSON)', 'exportEventToFiles')

tools/appscript/generate-grid.mjs

Lines changed: 0 additions & 41 deletions
This file was deleted.

tools/appscript/lib/schedule.mjs

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,26 @@
11
import { groupSessionMeetings } from '../../common/meetings.mjs';
2+
import { Srand } from '../../common/jsrand.mjs';
23

34
/**
45
* Fill the grid in the provided spreadsheet
56
*/
67
export function fillGridSheet(spreadsheet, project, validationErrors) {
7-
const sheet = spreadsheet.insertSheet('Grid', spreadsheet.getSheets().length - 1);
8-
project.sheets.grid.sheet = sheet;
8+
let gridVersion = Math.max(
9+
...spreadsheet.getSheets()
10+
.map(sheet => sheet.getName())
11+
.filter(name => name.match(/^Schedule v(\d+)$/))
12+
.map(name => name.match(/^Schedule v(\d+)$/)[1])
13+
.map(nb => parseInt(nb))
14+
);
15+
if (gridVersion === -Infinity) {
16+
gridVersion = 0;
917
}
18+
gridVersion += 1;
19+
20+
const sheet = spreadsheet.insertSheet(
21+
'Schedule v' + gridVersion,
22+
spreadsheet.getSheets().length
23+
);
1024
console.log('- clear sheet');
1125
sheet.clear();
1226
console.log('- attach result as metadata');
@@ -27,19 +41,17 @@ export function fillGridSheet(spreadsheet, project, validationErrors) {
2741
addSessions(sheet, project, validationErrors);
2842
console.log('- add borders');
2943
addBorders(sheet, project);
30-
fillGridValidationSheet(spreadsheet, project, validationErrors);
44+
fillGridValidationSheet(spreadsheet, project, gridVersion, validationErrors);
3145
}
3246

3347
/**
3448
* Fill the grid validation sheet
3549
*/
36-
function fillGridValidationSheet(spreadsheet, project, validationErrors) {
37-
let sheet = project.sheets.gridValidation.sheet;
38-
if (!sheet) {
39-
sheet = spreadsheet.insertSheet('Grid validation',
40-
spreadsheet.getSheets().length - 1);
41-
project.sheets.gridValidation.sheet = sheet;
42-
}
50+
function fillGridValidationSheet(spreadsheet, project, gridVersion, validationErrors) {
51+
const sheet = spreadsheet.insertSheet(
52+
`Schedule v${gridVersion} issues`,
53+
spreadsheet.getSheets().length
54+
);
4355
console.log('- clear grid validation sheet');
4456
sheet.clear();
4557

tools/appscript/main.mjs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
import _createOnOpenTrigger from './create-onopen-trigger.mjs';
1818
import _addTPACMenu from './add-custom-menu.mjs';
19-
import _generateGrid from './generate-grid.mjs';
2019
import _validateGrid from './validate-grid.mjs';
2120
import _proposeGrid from './propose-grid.mjs';
2221
import _exportGrid from './export-grid.mjs';
@@ -30,7 +29,6 @@ import _applySchedule from './apply-schedule.mjs';
3029

3130
function main() { _createOnOpenTrigger(); }
3231
function addTPACMenu() { _addTPACMenu(); }
33-
function generateGrid() { _generateGrid(); }
3432
function validateGrid() { _validateGrid(); }
3533
function proposeGrid() { _proposeGrid(); }
3634
function exportGrid() { _exportGrid(); }

tools/appscript/propose-grid.mjs

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import {
2-
getProject, refreshProject, saveSessionValidationInSheet
3-
} from './lib/project.mjs';
41
import reportError from './lib/report-error.mjs';
2+
import { getProject } from './lib/project.mjs';
53
import { fillGridSheet } from './lib/schedule.mjs';
64
import { fetchMapping } from './lib/w3cid-map.mjs';
75
import { suggestSchedule } from '../common/schedule.mjs';
@@ -43,18 +41,12 @@ async function proposeGrid(spreadsheet) {
4341
error.type !== 'irc');
4442
const validSessions = project.sessions.filter(s =>
4543
!errors.find(error => error.number === s.number));
44+
const invalidSessions = project.sessions.filter(s =>
45+
errors.find(error => error.number === s.number));
4646
project.sessions
4747
.filter(s => errors.find(error => error.number === s.number))
4848
.forEach(s => s.blockingError = true);
4949
console.log(`- found ${validSessions.length} valid sessions among them: ${validSessions.map(s => s.number).join(', ')}`);
50-
for (const change of changes) {
51-
console.warn(`- save validation problems for session ${change.number}`);
52-
const session = project.sessions.find(s => s.number === change.number);
53-
session.validation.error = change.validation.error;
54-
session.validation.warning = change.validation.warning;
55-
session.validation.check = change.validation.check;
56-
await saveSessionValidationInSheet(session, project);
57-
}
5850
console.log(`Validate sessions... done`);
5951

6052
console.log(`Prepare parameters...`);
@@ -114,7 +106,7 @@ async function proposeGrid(spreadsheet) {
114106
console.log(`Compute new grid... done`);
115107

116108
console.log(`Validate new grid...`);
117-
const { errors: newErrors, changes: newChanges } = await validateGrid(project, { what: 'scheduling' })
109+
let { errors: newErrors, changes: newChanges } = await validateGrid(project, { what: 'scheduling' })
118110
if (newErrors.length) {
119111
for (const error of newErrors) {
120112
console.warn(`- [${error.severity}: ${error.type}] #${error.session}: ${error.messages.join(', ')}`);
@@ -123,28 +115,34 @@ async function proposeGrid(spreadsheet) {
123115
else {
124116
console.log(`- looks good!`);
125117
}
126-
for (const change of newChanges) {
127-
console.warn(`- save validation problems for session ${change.number}`);
128-
const session = project.sessions.find(s => s.number === change.number);
129-
session.validation.error = change.validation.error;
130-
session.validation.warning = change.validation.warning;
131-
session.validation.check = change.validation.check;
132-
await saveSessionValidationInSheet(session, project);
133-
}
134118
console.warn(`Validate new grid... done`);
135119

136-
console.log('Update meeting info in sessions sheet...');
137-
refreshProject(spreadsheet, project, { what: 'grid' });
138-
console.log('Update meeting info in sessions sheet... done');
139-
140120
console.log('Report new grid in grid sheet...');
121+
if (invalidSessions.length > 0) {
122+
newErrors = invalidSessions
123+
.map(session => errors.filter(error => error.number === s.number))
124+
.flat()
125+
.concat(newErrors);
126+
}
127+
if (noschedule.length > 0) {
128+
newErrors = validSessions
129+
.filter(session =>
130+
!session.meetings ||
131+
session.meetings.length === 0 ||
132+
session.meetings.find(m => !(m.room && m.day && m.slot)))
133+
.map(session => Object.assign({
134+
severity: 'error',
135+
type: 'conflict',
136+
session: session.number,
137+
messages: ['Session could not be scheduled due to unresolvable conflicts']
138+
}))
139+
.concat(newErrors);
140+
}
141141
fillGridSheet(spreadsheet, project, newErrors);
142142
console.log('Report new grid in grid sheet... done');
143143

144144
console.log('Report results to user...');
145145
let msg = `<p>Spreadsheet updated with a new schedule proposal.</p>`;
146-
const invalidSessions = project.sessions.filter(s =>
147-
errors.find(error => error.number === s.number));
148146
if (invalidSessions.length > 0) {
149147
msg += `<p>
150148
I could not schedule the following sessions because they are invalid:

0 commit comments

Comments
 (0)