Skip to content

Commit

Permalink
Refine the TPAC custom menu
Browse files Browse the repository at this point in the history
The current options would not make a lot of sense for event organizers. The new
options split different types of updates in a way that hopefully makes more
sense.
  • Loading branch information
tidoust committed Feb 17, 2025
1 parent eed951e commit e22b066
Show file tree
Hide file tree
Showing 10 changed files with 238 additions and 87 deletions.
30 changes: 24 additions & 6 deletions tools/appscript/add-custom-menu.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,33 @@
*/
export default function () {
SpreadsheetApp.getUi().createMenu('TPAC')
.addItem('Refresh grid', 'generateGrid')
.addItem('Validate grid', 'validateGrid')
.addSubMenu(
SpreadsheetApp.getUi()
.createMenu('Event schedule grid')
.addItem('Refresh the grid view', 'generateGrid')
.addItem('Validate the grid', 'validateGrid')
.addSeparator()
.addItem('Publish the grid', 'exportGrid')
.addSeparator()
.addItem('Fetch published grid from GitHub', 'importGrid')
)
.addSubMenu(
SpreadsheetApp.getUi()
.createMenu('Event sessions')
.addItem('Fetch the list of sessions from GitHub', 'importSessions')
)
.addSubMenu(
SpreadsheetApp.getUi()
.createMenu('Event info, rooms, days, slots')
.addItem('Fetch event info, rooms, days, slots from GitHub', 'importMetadata')
/*.addSeparator()
.addItem('Export event info, rooms, days, slots to GitHub', 'exportMetadata')*/
)
.addSeparator()
.addSubMenu(
SpreadsheetApp.getUi()
.createMenu('Sync with GitHub')
.addItem('Import data from GitHub', 'importFromGitHub')
.addItem('Export data to GitHub', 'exportToGitHub')
.addItem('Export event data as JSON', 'exportEventData')
.createMenu('Advanced')
.addItem('Dump event data as JSON', 'exportEventData')
)
.addToUi();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,36 @@
import { getProject } from './project.mjs';
import reportError from './report-error.mjs';
import { fetchProjectFromGitHub, saveSessionMeetings } from '../common/project.mjs';

import {
fetchProjectFromGitHub,
saveSessionMeetings,
saveSessionNote } from '../common/project.mjs';

/**
* Trigger a GitHub workflow that refreshes the data from GitHub
*/
export default async function () {
// TODO: consider reading only the list of sessions
console.log('Read data from spreadsheet...');
const project = getProject(SpreadsheetApp.getActiveSpreadsheet());
console.log('Read data from spreadsheet... done');
try {
// TODO: consider reading only the list of sessions
console.log('Read data from spreadsheet...');
const project = getProject(SpreadsheetApp.getActiveSpreadsheet());
console.log('Read data from spreadsheet... done');

if (!project.metadata.reponame) {
reportError(`No GitHub repository associated with the current document.
if (!project.metadata.reponame) {
reportError(`No GitHub repository associated with the current document.
Make sure that the "GitHub repository name" parameter is set in the "Event" sheet.
Make sure that the "GitHub repository name" parameter is set in the "Event" sheet.
Also make sure the targeted repository and project have been properly initialized.
If not, ask François or Ian to run the required initialization steps.`);
}
Also make sure the targeted repository and project have been properly initialized.
If not, ask François or Ian to run the required initialization steps.`);
return;
}

const repoparts = project.metadata.reponame.split('/');
const repo = {
owner: repoparts.length > 1 ? repoparts[0] : 'w3c',
name: repoparts.length > 1 ? repoparts[1] : repoparts[0]
};
const repoparts = project.metadata.reponame.split('/');
const repo = {
owner: repoparts.length > 1 ? repoparts[0] : 'w3c',
name: repoparts.length > 1 ? repoparts[1] : repoparts[0]
};

try {
console.log('Fetch data from GitHub...');
const githubProject = await fetchProjectFromGitHub(
repo.owner === 'w3c' ? repo.owner : `user/${repo.owner}`,
Expand All @@ -38,21 +41,21 @@ If not, ask François or Ian to run the required initialization steps.`);

console.log('Export updates when needed...');
const updated = [];
for (const session of githubProject.sessions) {
for (const ghSession of githubProject.sessions) {
const ssSession = project.sessions.find(s =>
s.number === session.number);
s.number === ghSession.number);
if (!ssSession) {
const htmlOutput = HtmlService
.createHtmlOutput(`
<p>Sorry, I did not export anything because I detected a new
session in the GitHub repository that is not in the spreadsheet yet:
</p>
<blockquote>
<p>${session.title}
(<a href="https://github.com/${session.repository}/issues/${session.number}">#${session.number}</a>)
<p>${ghSession.title}
(<a href="https://github.com/${ghSession.repository}/issues/${ghSession.number}">#${ghSession.number}</a>)
</p>
</blockquote>
<p>Please run <b>TPAC > Sync with GitHub > Import data from GitHub</b>
<p>Please run <b>TPAC > Event sessions > Fetch the list of sessions from GitHub</b>
first to retrieve it.
You may also want to re-validate the grid afterwards!</p>`
)
Expand All @@ -64,21 +67,26 @@ If not, ask François or Ian to run the required initialization steps.`);

// TODO: handle meeting column for TPAC group meetings

if ((session.room !== ssSession.room) ||
(session.day !== ssSession.day) ||
(session.slot !== ssSession.slot)) {
console.warn(`- updating #${session.number}...`);
session.room = ssSession.room;
session.day = ssSession.day;
session.slot = ssSession.slot;
await saveSessionMeetings(session, githubProject);
updated.push(session);
console.warn(`- updating #${session.number}... done`);
if (((ghSession.room ?? '') !== (ssSession.room ?? '')) ||
((ghSession.day ?? '') !== (ssSession.day ?? '')) ||
((ghSession.slot ?? '') !== (ssSession.slot ?? ''))) {
console.warn(`- updating meeting info for #${ghSession.number}...`);
ghSession.room = ssSession.room;
ghSession.day = ssSession.day;
ghSession.slot = ssSession.slot;
await saveSessionMeetings(ghSession, githubProject);
updated.push(ghSession);
console.warn(`- updating meeting info for #${ghSession.number}... done`);
}

if ((ghSession.validation.note ?? '') !== (ssSession.note ?? '')) {
console.warn(`- updating note for #${ghSession.number}...`);
await saveSessionNote(ghSession, ssSession.note, githubProject);
console.warn(`- updating note for #${ghSession.number}... done`);
}
}
console.log('Export updates when needed... done');

// Report the list of sessions that were updated
console.log('Report result...');
if (updated.length > 0) {
const list = updated.map(s =>
Expand All @@ -92,7 +100,7 @@ If not, ask François or Ian to run the required initialization steps.`);
`)
.setWidth(400)
.setHeight(400);
SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Updated');
SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Grid published');
}
else {
const htmlOutput = HtmlService
Expand Down
20 changes: 20 additions & 0 deletions tools/appscript/export-metadata.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import reportError from './report-error.mjs';

/**
* Trigger a GitHub workflow that refreshes the data from GitHub
*/
export default async function () {
try {
console.log('Export metadata to GitHub...');
console.log('- TODO: export metadata to GitHub');
console.log('Export metadata to GitHub... done');

console.log('Report result...');
console.log('- TODO: report result');
console.log('Report result... done');
}
catch(err) {
reportError(err.toString());
return;
}
}
59 changes: 22 additions & 37 deletions tools/appscript/import-from-github.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import * as YAML from '../../node_modules/yaml/browser/index.js';
/**
* Trigger a GitHub workflow that refreshes the data from GitHub
*/
export default async function () {
export default async function (type) {
console.log('Read data from spreadsheet...');
const project = getProject(SpreadsheetApp.getActiveSpreadsheet());
console.log('Read data from spreadsheet... done');
Expand All @@ -28,47 +28,32 @@ If not, ask François or Ian to run the required initialization steps.`);
name: repoparts.length > 1 ? repoparts[1] : repoparts[0]
};

try {
let template = null;
if (type === 'all' || type === 'metadata') {
console.log('Fetch session template from GitHub...');
const yamlTemplateResponse = UrlFetchApp.fetch(
`https://raw.githubusercontent.com/${repo.owner}/${repo.name}/refs/heads/main/.github/ISSUE_TEMPLATE/session.yml`
);
const yamlTemplate = yamlTemplateResponse.getContentText();
const template = YAML.parse(yamlTemplate);
template = YAML.parse(yamlTemplate);
console.log('Fetch session template from GitHub... done');

console.log('Fetch data from GitHub...');
const githubProject = await fetchProjectFromGitHub(
repo.owner === 'w3c' ? repo.owner : `user/${repo.owner}`,
repo.name,
template
);
console.log('Fetch data from GitHub... done');

console.log('Refresh spreadsheet data...');
refreshProject(SpreadsheetApp.getActiveSpreadsheet(), githubProject, {
what: 'all'
});
console.log('Refresh spreadsheet data... done');

console.log('Report result...');
const htmlOutput = HtmlService
.createHtmlOutput(`
<p>Spreadsheet updated with data from GitHub:</p>
<ul>
<li><b>${githubProject.rooms.length}</b> rooms</li>
<li><b>${githubProject.days.length}</b> days</li>
<li><b>${githubProject.slots.length}</b> slots</li>
<li><b>${githubProject.sessions.length}</b> sessions</li>
</ul>
`)
.setWidth(300)
.setHeight(400);
SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Data exported');
console.log('Report result... done');
}
catch(err) {
reportError(err.toString());
return;
}

console.log('Fetch data from GitHub...');
const githubProject = await fetchProjectFromGitHub(
repo.owner === 'w3c' ? repo.owner : `user/${repo.owner}`,
repo.name,
template
);
console.log('Fetch data from GitHub... done');

console.log('Refresh spreadsheet data...');
refreshProject(
SpreadsheetApp.getActiveSpreadsheet(),
githubProject,
{ what: type }
);
console.log('Refresh spreadsheet data... done');

return githubProject;
}
26 changes: 26 additions & 0 deletions tools/appscript/import-grid.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import reportError from './report-error.mjs';
import importFromGitHub from './import-from-github.mjs';

/**
* Trigger a GitHub workflow that refreshes the data from GitHub
*/
export default async function () {
try {
const githubProject = await importFromGitHub('grid');

console.log('Report result...');
console.log('- TODO: say what got updated');
const htmlOutput = HtmlService
.createHtmlOutput(`
<p>Schedule imported from GitHub.</p>
`)
.setWidth(300)
.setHeight(400);
SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Schedule imported');
console.log('Report result... done');
}
catch(err) {
reportError(err.toString());
return;
}
}
30 changes: 30 additions & 0 deletions tools/appscript/import-metadata.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import reportError from './report-error.mjs';
import importFromGitHub from './import-from-github.mjs';

/**
* Trigger a GitHub workflow that refreshes the data from GitHub
*/
export default async function () {
try {
const githubProject = await importFromGitHub('metadata');

console.log('Report result...');
const htmlOutput = HtmlService
.createHtmlOutput(`
<p>Spreadsheet updated with metadata info from GitHub:</p>
<ul>
<li><b>${githubProject.rooms.length}</b> rooms</li>
<li><b>${githubProject.days.length}</b> days</li>
<li><b>${githubProject.slots.length}</b> slots</li>
</ul>
`)
.setWidth(300)
.setHeight(400);
SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Event info updated');
console.log('Report result... done');
}
catch(err) {
reportError(err.toString());
return;
}
}
28 changes: 28 additions & 0 deletions tools/appscript/import-sessions.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import reportError from './report-error.mjs';
import importFromGitHub from './import-from-github.mjs';

/**
* Trigger a GitHub workflow that refreshes the data from GitHub
*/
export default async function () {
try {
const githubProject = await importFromGitHub('sessions');

console.log('Report result...');
const htmlOutput = HtmlService
.createHtmlOutput(`
<p>
<b>${githubProject.sessions.length}</b>
sessions retrieved from GitHub.
</p>
`)
.setWidth(300)
.setHeight(400);
SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Sessions updated');
console.log('Report result... done');
}
catch(err) {
reportError(err.toString());
return;
}
}
14 changes: 10 additions & 4 deletions tools/appscript/main.mjs
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
import _createOnOpenTrigger from './create-onopen-trigger.mjs';
import _addTPACMenu from './add-custom-menu.mjs';
import _importFromGitHub from './import-from-github.mjs';
import _exportToGitHub from './export-to-github.mjs';
import _generateGrid from './generate-grid.mjs';
import _validateGrid from './validate-grid.mjs';
import _exportGrid from './export-grid.mjs';
import _importGrid from './import-grid.mjs';
import _importSessions from './import-sessions.mjs';
import _importMetadata from './import-metadata.mjs';
import _exportMetadata from './export-metadata.mjs';
import _exportEventData from './export-event-data.mjs';

function main() { _createOnOpenTrigger(); }
function addTPACMenu() { _addTPACMenu(); }
function importFromGitHub() { _importFromGitHub(); }
function exportToGitHub() { _exportToGitHub(); }
function generateGrid() { _generateGrid(); }
function validateGrid() { _validateGrid(); }
function exportGrid() { _exportGrid(); }
function importGrid() { _importGrid(); }
function importSessions() { _importSessions(); }
function importMetadata() { _importMetadata(); }
function exportMetadata() { _exportMetadata(); }
function exportEventData() { _exportEventData(); }
Loading

0 comments on commit e22b066

Please sign in to comment.