Website updates round 3
- Add floating concepts: Parallel worlding, Guerrilla futuring - Replace Speculative fiction with Economic sci-fi - Fix all example URLs with correct links - Update Digital Publishing description - Convert Playing with Reality to bullet points - Update Who should attend with comprehensive list - Change contribution field to multi-select checkboxes - Update Ready to Play? to Ready to Hijack Reality? - Fix Location footer link - Add organizing team info (Rok, Pekko, Carolina) - Add website credit - Add Maker Spaces & Equipment section - Add Financial Transparency section with CCG25 link - Update server.js for multi-select contribute handling Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
705497ef34
commit
b3dbc60324
138
index.html
138
index.html
|
|
@ -1300,12 +1300,20 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="floating-card">
|
<div class="floating-card">
|
||||||
<span class="emoji">✒️</span>
|
<span class="emoji">✒️</span>
|
||||||
Speculative<br>fiction
|
Economic<br>sci-fi
|
||||||
</div>
|
</div>
|
||||||
<div class="floating-card">
|
<div class="floating-card">
|
||||||
<span class="emoji">🎲</span>
|
<span class="emoji">🎲</span>
|
||||||
Games as<br>organisations
|
Games as<br>organisations
|
||||||
</div>
|
</div>
|
||||||
|
<div class="floating-card" style="top: 60%; right: 10%; animation-delay: 3s;">
|
||||||
|
<span class="emoji">🌐</span>
|
||||||
|
Parallel<br>worlding
|
||||||
|
</div>
|
||||||
|
<div class="floating-card" style="bottom: 0; right: 25%; animation-delay: 4s;">
|
||||||
|
<span class="emoji">🔮</span>
|
||||||
|
Guerrilla<br>futuring
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1328,7 +1336,7 @@
|
||||||
<div class="community-card">
|
<div class="community-card">
|
||||||
<span class="icon">📚</span>
|
<span class="icon">📚</span>
|
||||||
<h3>Digital Publishing</h3>
|
<h3>Digital Publishing</h3>
|
||||||
<p>Digital publishing with partner organisations like the Institute of Network Cultures (TBC)</p>
|
<p>Publishing short sci-fi stories, tabletop games, LARP toolkits and other formats as an open-access anthology with partners like Bread Coop and the Institute of Network Cultures (TBC)</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="community-card">
|
<div class="community-card">
|
||||||
<span class="icon">🎮</span>
|
<span class="icon">🎮</span>
|
||||||
|
|
@ -1364,15 +1372,18 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="track-content">
|
<div class="track-content">
|
||||||
<div class="track-description">
|
<div class="track-description">
|
||||||
<p>Treating culture and social conventions as reprogrammable design spaces.</p>
|
<ul>
|
||||||
|
<li>Unshackled play with social conventions, aka "reality", aka "the world"</li>
|
||||||
|
<li>Treating culture as reprogrammable design spaces</li>
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="track-examples">
|
<div class="track-examples">
|
||||||
<h4>Examples</h4>
|
<h4>Examples</h4>
|
||||||
<a href="https://theyesmen.org/" target="_blank" rel="noopener" class="example-tag">The Yes Men</a>
|
<a href="https://en.wikipedia.org/wiki/The_Yes_Men" target="_blank" rel="noopener" class="example-tag">The Yes Men</a>
|
||||||
<a href="https://en.wikipedia.org/wiki/Bureau_of_Inverse_Technology" target="_blank" rel="noopener" class="example-tag">Bureau of Inverse Technology</a>
|
<a href="https://www.bureauit.org/decade/" target="_blank" rel="noopener" class="example-tag">Bureau of Inverse Technology</a>
|
||||||
<a href="https://www.billboardliberation.com/" target="_blank" rel="noopener" class="example-tag">Billboard Liberation Front</a>
|
<a href="https://en.wikipedia.org/wiki/Billboard_Liberation_Front" target="_blank" rel="noopener" class="example-tag">Billboard Liberation Front</a>
|
||||||
<a href="https://politicalbeauty.com/" target="_blank" rel="noopener" class="example-tag">Center for Political Beauty</a>
|
<a href="https://politicalbeauty.com/" target="_blank" rel="noopener" class="example-tag">Center for Political Beauty</a>
|
||||||
<a href="https://en.wikipedia.org/wiki/Luther_Blissett_(pseudonym)" target="_blank" rel="noopener" class="example-tag">Luther Blisset Project</a>
|
<a href="https://www.lutherblissett.net/" target="_blank" rel="noopener" class="example-tag">Luther Blissett Project</a>
|
||||||
<a href="https://en.wikipedia.org/wiki/Situationist_International" target="_blank" rel="noopener" class="example-tag">Situationist International</a>
|
<a href="https://en.wikipedia.org/wiki/Situationist_International" target="_blank" rel="noopener" class="example-tag">Situationist International</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1393,10 +1404,10 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="track-examples">
|
<div class="track-examples">
|
||||||
<h4>Examples</h4>
|
<h4>Examples</h4>
|
||||||
<a href="https://craphound.com/category/walkaway/" target="_blank" rel="noopener" class="example-tag">Walkaway</a>
|
<a href="https://en.wikipedia.org/wiki/Walkaway_(Doctorow_novel)" target="_blank" rel="noopener" class="example-tag">Walkaway</a>
|
||||||
<a href="https://en.wikipedia.org/wiki/The_Ministry_for_the_Future" target="_blank" rel="noopener" class="example-tag">The Ministry for the Future</a>
|
<a href="https://en.wikipedia.org/wiki/The_Ministry_for_the_Future" target="_blank" rel="noopener" class="example-tag">The Ministry for the Future</a>
|
||||||
<a href="https://www.worldweaverpress.com/store/p117/multispecies-cities.html" target="_blank" rel="noopener" class="example-tag">Multispecies Cities: Solarpunk Urban Futures</a>
|
<a href="https://www.world-weaver-press.com/store/p4/Multispecies_Cities.html" target="_blank" rel="noopener" class="example-tag">Multispecies Cities: Solarpunk Urban Futures</a>
|
||||||
<a href="https://www.akpress.org/everything-for-everyone.html" target="_blank" rel="noopener" class="example-tag">An Oral History of the New York Commune, 2052–2072</a>
|
<a href="https://www.commonnotions.org/everything-for-everyone" target="_blank" rel="noopener" class="example-tag">An Oral History of the New York Commune, 2052–2072</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1416,13 +1427,12 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="track-examples">
|
<div class="track-examples">
|
||||||
<h4>Examples</h4>
|
<h4>Examples</h4>
|
||||||
<a href="https://futurematic.org/" target="_blank" rel="noopener" class="example-tag">Futurematic</a>
|
<a href="https://extrapolationfactory.com/Futurematic" target="_blank" rel="noopener" class="example-tag">Futurematic</a>
|
||||||
<a href="https://www.tomorrowsenergytoday.net/" target="_blank" rel="noopener" class="example-tag">Tomorrow's Energy Today</a>
|
<a href="https://medium.com/@futuryst/tomorrows-energy-today-f9051ba4d139" target="_blank" rel="noopener" class="example-tag">Tomorrow's Energy Today</a>
|
||||||
<a href="https://anightattheorfelia.com/" target="_blank" rel="noopener" class="example-tag">A Night at the Orfelia</a>
|
<a href="https://rat.computer/orfelia" target="_blank" rel="noopener" class="example-tag">A Night at the Orfelia</a>
|
||||||
<span class="example-tag">The Treaty of Finsbury Park</span>
|
<a href="https://treaty.finsburypark.live/" target="_blank" rel="noopener" class="example-tag">The Treaty of Finsbury Park</a>
|
||||||
<span class="example-tag">Queer Embassy of Possible Futures</span>
|
<a href="https://archive.madhousehelsinki.fi/events/Natalia%20Skoczylas%20&%20Vishnu%20Vardhani%20Queer%20Embassy%20of%20Possible%20Futures" target="_blank" rel="noopener" class="example-tag">Queer Embassy of Possible Futures</a>
|
||||||
<span class="example-tag">NOVA: Future Thoughts on Surviving Together</span>
|
<a href="https://www.berlinerfestspiele.de/en/programm/2024/radical-playgrounds/programm/nova-ein-feministisches-spekulatives-larp" target="_blank" rel="noopener" class="example-tag">NOVA: Future Thoughts on Surviving Together</a>
|
||||||
<span class="example-tag">Future 14b</span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1441,12 +1451,12 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="track-examples">
|
<div class="track-examples">
|
||||||
<h4>Examples</h4>
|
<h4>Examples</h4>
|
||||||
<a href="https://www.utopia-tabletop.com/" target="_blank" rel="noopener" class="example-tag">Utopia on the Tabletop</a>
|
<a href="https://sadpress.itch.io/utopia-on-the-tabletop" target="_blank" rel="noopener" class="example-tag">Utopia on the Tabletop</a>
|
||||||
<span class="example-tag">Game-Changers: The Game</span>
|
<a href="https://gamechangers.wiki/editions/panke-gallery/" target="_blank" rel="noopener" class="example-tag">Game-Changers: The Game</a>
|
||||||
<a href="https://gamecommons.org/" target="_blank" rel="noopener" class="example-tag">Game Commons Online Platform</a>
|
<a href="https://mauvaiscontact.info/kop/gamecommons/index.html" target="_blank" rel="noopener" class="example-tag">Game Commons Online Platform</a>
|
||||||
<a href="https://play.half.earth/" target="_blank" rel="noopener" class="example-tag">Half-Earth Socialism</a>
|
<a href="https://play.half.earth/" target="_blank" rel="noopener" class="example-tag">Half-Earth Socialism</a>
|
||||||
<a href="https://post-growth.org/toolkit/" target="_blank" rel="noopener" class="example-tag">Post-Growth Toolkit – The Game</a>
|
<a href="http://postgrowth.art/pages/the-game.html" target="_blank" rel="noopener" class="example-tag">Post-Growth Toolkit – The Game</a>
|
||||||
<span class="example-tag">The Social Strike Game</span>
|
<a href="https://redplentygames.com/social-strike/" target="_blank" rel="noopener" class="example-tag">The Social Strike Game</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1466,12 +1476,12 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="track-examples">
|
<div class="track-examples">
|
||||||
<h4>Examples</h4>
|
<h4>Examples</h4>
|
||||||
<a href="https://witnesspedia.org/" target="_blank" rel="noopener" class="example-tag">Witnesspedia</a>
|
<a href="https://edgeryders.eu/c/witness/witnesspedia/378" target="_blank" rel="noopener" class="example-tag">Witnesspedia</a>
|
||||||
<a href="https://pocas.earth/" target="_blank" rel="noopener" class="example-tag">POCAS</a>
|
<a href="https://www.medialab-matadero.es/en/projects/pocas-poca-organizacion-colaborativa-de-auto-servicio" target="_blank" rel="noopener" class="example-tag">POCAS</a>
|
||||||
<a href="https://nordiclarp.org/wiki/" target="_blank" rel="noopener" class="example-tag">Nordic Larp Wiki</a>
|
<a href="https://www.nordiclarp.org/wiki/Main_Page" target="_blank" rel="noopener" class="example-tag">Nordic Larp Wiki</a>
|
||||||
<span class="example-tag">Green Mediaography</span>
|
<a href="https://greenmediography.nl/" target="_blank" rel="noopener" class="example-tag">Green Mediaography</a>
|
||||||
<span class="example-tag">Board Game Mechanics Repository</span>
|
<a href="https://boardgamegeek.com/browse/boardgamemechanic" target="_blank" rel="noopener" class="example-tag">Board Game Mechanics Repository</a>
|
||||||
<span class="example-tag">Artists, Activists, and Worldbuilders on DAOs</span>
|
<a href="https://networkcultures.org/blog/publication/artists-activists-and-worldbuilders-on-decentralised-autonomous-organisations-conversations-about-funding-self-organisation-and-reclaiming-the-future/" target="_blank" rel="noopener" class="example-tag">Artists, Activists, and Worldbuilders on DAOs</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1509,6 +1519,20 @@
|
||||||
<span>A co-working, co-living and event venue that harbours artists, digital movements and decentralized communities</span>
|
<span>A co-working, co-living and event venue that harbours artists, digital movements and decentralized communities</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="detail-item">
|
||||||
|
<span class="icon">🛠️</span>
|
||||||
|
<div>
|
||||||
|
<strong>Maker Spaces & Equipment</strong>
|
||||||
|
<span>Access to 3D printer, laser cutter, sewing station, farmbot, book binding station and various workshop rooms</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="detail-item">
|
||||||
|
<span class="icon">💰</span>
|
||||||
|
<div>
|
||||||
|
<strong>Financial Transparency</strong>
|
||||||
|
<span>Food for the first 3 days will be catered, then self/community organised. Accommodation at the Hub with potential subsidies. <a href="https://ccg2025.vercel.app/financial-transparency" target="_blank" rel="noopener" style="color: var(--accent-cyan);">See full transparency details →</a></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -1551,7 +1575,7 @@
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 style="margin-top: 2rem;">Who should attend?</h3>
|
<h3 style="margin-top: 2rem;">Who should attend?</h3>
|
||||||
<p>Sci-fi writers, game-makers, artivists, LARPers, weird economists, futurists, performers, eutopian dreamers.</p>
|
<p>Sci-fi and cli-fi writers, pluriversal worldbuilders, game designers, storytellers, artists, performers, LARPers, commons and degrowth activists, weird economists, solarpunks, participatory futurists, speculative designers, researchers and academics, technologists, open-source developers, and any and all curious others.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<form class="register-form" id="registration-form">
|
<form class="register-form" id="registration-form">
|
||||||
|
|
@ -1630,17 +1654,41 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Would you like to contribute to the programme?</label>
|
<label>Would you like to contribute to the programme? (select all that apply)</label>
|
||||||
<select name="contribute">
|
<div class="checkbox-group">
|
||||||
<option value="">Select one...</option>
|
<label class="checkbox-item">
|
||||||
<option value="session">Yes - I'd like to pitch a session</option>
|
<input type="checkbox" name="contribute" value="session">
|
||||||
<option value="workshop">Yes - I'd like to run a workshop</option>
|
<span>Propose a session (talk / discussion / panel / other)</span>
|
||||||
<option value="game">Yes - I'd like to share/playtest a game</option>
|
</label>
|
||||||
<option value="performance">Yes - I'd like to perform/facilitate</option>
|
<label class="checkbox-item">
|
||||||
<option value="collaborate">Yes - I'd like to collaborate on something</option>
|
<input type="checkbox" name="contribute" value="workshop">
|
||||||
<option value="participate">No - I'd like to participate</option>
|
<span>Host a workshop (co-writing / game co-design / other)</span>
|
||||||
<option value="unsure">Not sure yet</option>
|
</label>
|
||||||
</select>
|
<label class="checkbox-item">
|
||||||
|
<input type="checkbox" name="contribute" value="game">
|
||||||
|
<span>Bring a game to play or playtest (tabletop / digital / hybrid)</span>
|
||||||
|
</label>
|
||||||
|
<label class="checkbox-item">
|
||||||
|
<input type="checkbox" name="contribute" value="larp">
|
||||||
|
<span>Run a LARP or other participatory format</span>
|
||||||
|
</label>
|
||||||
|
<label class="checkbox-item">
|
||||||
|
<input type="checkbox" name="contribute" value="project">
|
||||||
|
<span>Co-create a project or publication</span>
|
||||||
|
</label>
|
||||||
|
<label class="checkbox-item">
|
||||||
|
<input type="checkbox" name="contribute" value="other">
|
||||||
|
<span>Contribute in another way (please share below)</span>
|
||||||
|
</label>
|
||||||
|
<label class="checkbox-item">
|
||||||
|
<input type="checkbox" name="contribute" value="attend">
|
||||||
|
<span>Attend only</span>
|
||||||
|
</label>
|
||||||
|
<label class="checkbox-item">
|
||||||
|
<input type="checkbox" name="contribute" value="unsure">
|
||||||
|
<span>Not sure yet</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|
@ -1667,7 +1715,7 @@
|
||||||
|
|
||||||
<section class="cta-section">
|
<section class="cta-section">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h2>Ready to <span style="background: var(--gradient-1); -webkit-background-clip: text; -webkit-text-fill-color: transparent;">Play</span>?</h2>
|
<h2>Ready to <span style="background: var(--gradient-1); -webkit-background-clip: text; -webkit-text-fill-color: transparent;">Hijack Reality</span>?</h2>
|
||||||
<p>Join fellow dreamers, makers, and reality-benders in prefiguring postcapitalist futures.</p>
|
<p>Join fellow dreamers, makers, and reality-benders in prefiguring postcapitalist futures.</p>
|
||||||
<div class="cta-group">
|
<div class="cta-group">
|
||||||
<a href="#register" class="btn btn-primary">Register Now</a>
|
<a href="#register" class="btn btn-primary">Register Now</a>
|
||||||
|
|
@ -1687,7 +1735,7 @@
|
||||||
<h4>Event</h4>
|
<h4>Event</h4>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#about">About</a></li>
|
<li><a href="#about">About</a></li>
|
||||||
<li><a href="#location">Location</a></li>
|
<li><a href="#logistics">Location</a></li>
|
||||||
<li><a href="#programme">Programme</a></li>
|
<li><a href="#programme">Programme</a></li>
|
||||||
<li><a href="#register">Register</a></li>
|
<li><a href="#register">Register</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
@ -1701,7 +1749,9 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="footer-bottom">
|
<div class="footer-bottom">
|
||||||
<p>WORLDPLAY 2026 · Built for the commons · <span style="color: var(--accent-purple);">Reality is a design space</span></p>
|
<p style="margin-bottom: 1rem;">The inaugural edition of WORLDPLAY is convened by <a href="https://futurescraft.eu" target="_blank" rel="noopener" style="color: var(--accent-cyan);">Rok Kranjc</a> (Futurescraft), <a href="https://economicspace.agency" target="_blank" rel="noopener" style="color: var(--accent-cyan);">Pekko Koskinen</a> (Economic Space Agency) and <a href="https://kumanoshindo.com" target="_blank" rel="noopener" style="color: var(--accent-cyan);">Carolina Carvalho</a> (Kumano Shindo, Greater Stellenbosch Trust).</p>
|
||||||
|
<p style="margin-bottom: 0.5rem;">WORLDPLAY 2026 · Built for the commons · <span style="color: var(--accent-purple);">Reality is a design space</span></p>
|
||||||
|
<p style="font-size: 0.8rem; opacity: 0.7;">Website design by <a href="https://jeffemmett.com" target="_blank" rel="noopener" style="color: var(--accent-cyan);">Jeff Emmett</a></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
@ -1890,7 +1940,7 @@
|
||||||
const data = {};
|
const data = {};
|
||||||
|
|
||||||
formData.forEach((value, key) => {
|
formData.forEach((value, key) => {
|
||||||
if (key === 'interests') {
|
if (key === 'interests' || key === 'contribute') {
|
||||||
if (!data[key]) data[key] = [];
|
if (!data[key]) data[key] = [];
|
||||||
data[key].push(value);
|
data[key].push(value);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
33
server.js
33
server.js
|
|
@ -76,7 +76,7 @@ async function appendToGoogleSheet(registration) {
|
||||||
registration.location,
|
registration.location,
|
||||||
registration.role,
|
registration.role,
|
||||||
Array.isArray(registration.interests) ? registration.interests.join(', ') : registration.interests,
|
Array.isArray(registration.interests) ? registration.interests.join(', ') : registration.interests,
|
||||||
registration.contribute,
|
Array.isArray(registration.contribute) ? registration.contribute.join(', ') : registration.contribute,
|
||||||
registration.message,
|
registration.message,
|
||||||
registration.newsletter ? 'Yes' : 'No',
|
registration.newsletter ? 'Yes' : 'No',
|
||||||
registration.id
|
registration.id
|
||||||
|
|
@ -131,15 +131,20 @@ async function sendConfirmationEmail(registration) {
|
||||||
};
|
};
|
||||||
|
|
||||||
const contributeLabels = {
|
const contributeLabels = {
|
||||||
'session': 'Pitch a session',
|
'session': 'Propose a session',
|
||||||
'workshop': 'Run a workshop',
|
'workshop': 'Host a workshop',
|
||||||
'game': 'Share/playtest a game',
|
'game': 'Bring a game to play or playtest',
|
||||||
'performance': 'Perform/facilitate',
|
'larp': 'Run a LARP or participatory format',
|
||||||
'collaborate': 'Collaborate on something',
|
'project': 'Co-create a project or publication',
|
||||||
'participate': 'Participate',
|
'other': 'Contribute in another way',
|
||||||
|
'attend': 'Attend only',
|
||||||
'unsure': 'Not sure yet'
|
'unsure': 'Not sure yet'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const contributeText = Array.isArray(registration.contribute) && registration.contribute.length > 0
|
||||||
|
? registration.contribute.map(c => contributeLabels[c] || c).join(', ')
|
||||||
|
: 'Not specified';
|
||||||
|
|
||||||
await resend.emails.send({
|
await resend.emails.send({
|
||||||
from: 'WORLDPLAY <hello@worldplay.art>',
|
from: 'WORLDPLAY <hello@worldplay.art>',
|
||||||
to: registration.email,
|
to: registration.email,
|
||||||
|
|
@ -198,10 +203,10 @@ async function sendConfirmationEmail(registration) {
|
||||||
<td style="padding: 8px 0; border-bottom: 1px solid rgba(157, 78, 221, 0.1);"><strong style="color: #f0f0f5;">Interests:</strong></td>
|
<td style="padding: 8px 0; border-bottom: 1px solid rgba(157, 78, 221, 0.1);"><strong style="color: #f0f0f5;">Interests:</strong></td>
|
||||||
<td style="padding: 8px 0; border-bottom: 1px solid rgba(157, 78, 221, 0.1);">${interestsText}</td>
|
<td style="padding: 8px 0; border-bottom: 1px solid rgba(157, 78, 221, 0.1);">${interestsText}</td>
|
||||||
</tr>
|
</tr>
|
||||||
${registration.contribute ? `
|
${(Array.isArray(registration.contribute) && registration.contribute.length > 0) || registration.contribute ? `
|
||||||
<tr>
|
<tr>
|
||||||
<td style="padding: 8px 0; border-bottom: 1px solid rgba(157, 78, 221, 0.1);"><strong style="color: #f0f0f5;">Contribution:</strong></td>
|
<td style="padding: 8px 0; border-bottom: 1px solid rgba(157, 78, 221, 0.1);"><strong style="color: #f0f0f5;">Contribution:</strong></td>
|
||||||
<td style="padding: 8px 0; border-bottom: 1px solid rgba(157, 78, 221, 0.1);">${contributeLabels[registration.contribute] || registration.contribute}</td>
|
<td style="padding: 8px 0; border-bottom: 1px solid rgba(157, 78, 221, 0.1);">${contributeText}</td>
|
||||||
</tr>
|
</tr>
|
||||||
` : ''}
|
` : ''}
|
||||||
</table>
|
</table>
|
||||||
|
|
@ -268,7 +273,7 @@ app.post('/api/register', async (req, res) => {
|
||||||
location: location?.trim() || '',
|
location: location?.trim() || '',
|
||||||
role: role === 'other' && otherRole ? `Other: ${otherRole.trim()}` : (role || ''),
|
role: role === 'other' && otherRole ? `Other: ${otherRole.trim()}` : (role || ''),
|
||||||
interests: interests || [],
|
interests: interests || [],
|
||||||
contribute: contribute || '',
|
contribute: contribute || [],
|
||||||
message: message?.trim() || '',
|
message: message?.trim() || '',
|
||||||
newsletter: newsletter === 'yes',
|
newsletter: newsletter === 'yes',
|
||||||
registeredAt: new Date().toISOString(),
|
registeredAt: new Date().toISOString(),
|
||||||
|
|
@ -343,7 +348,7 @@ app.get('/api/registrations/export', async (req, res) => {
|
||||||
r.location,
|
r.location,
|
||||||
r.role,
|
r.role,
|
||||||
Array.isArray(r.interests) ? r.interests.join('; ') : r.interests,
|
Array.isArray(r.interests) ? r.interests.join('; ') : r.interests,
|
||||||
r.contribute,
|
Array.isArray(r.contribute) ? r.contribute.join('; ') : r.contribute,
|
||||||
r.message.replace(/"/g, '""'),
|
r.message.replace(/"/g, '""'),
|
||||||
r.newsletter ? 'Yes' : 'No',
|
r.newsletter ? 'Yes' : 'No',
|
||||||
r.registeredAt
|
r.registeredAt
|
||||||
|
|
@ -393,7 +398,11 @@ app.get('/api/stats', async (req, res) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Count by contribute
|
// Count by contribute
|
||||||
if (r.contribute) {
|
if (Array.isArray(r.contribute)) {
|
||||||
|
r.contribute.forEach(contrib => {
|
||||||
|
stats.byContribute[contrib] = (stats.byContribute[contrib] || 0) + 1;
|
||||||
|
});
|
||||||
|
} else if (r.contribute) {
|
||||||
stats.byContribute[r.contribute] = (stats.byContribute[r.contribute] || 0) + 1;
|
stats.byContribute[r.contribute] = (stats.byContribute[r.contribute] || 0) + 1;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue