Facilitator Log Full

Prima Nota Event Log

Workshop Series Data


One-off Workshop Data

For the One Time Event


Choir Session Log

For all Prima Nota choirs


jQuery(document).ready(function($) { console.log('🎵 Choir: Waiting for conditional logic...'); var calculati // Отслеживание изменений в DOM (когда появляются поля) var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.type === 'childList' || mutation.type === 'attributes') { checkAndInitChoir(); } }); }); // Начинаем отслеживать изменения в форме var formC'.fluentform'); if (formContainer) { observer.observe(formContainer, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); } function checkAndInitChoir() { // Ищем видимые поля хора var choirFields = $('input[name*="choir"]:visible, input[name*="participant"][name*="choir"]:visible'); var expectedField = $('input[name*="expected"]:visible').filter(function() { return $(this).attr('name').toLowerCase().includes('choir'); }); if (choirFields.length >= 4 && !calculationsActive && expectedField.length > 0) { console.log('✅ Choir fields are now visible! Initializing calculations...'); calculati initChoirCalculations(); } } function initChoirCalculations() { // Находим все поля хора var fields = { expected: $('input[name*="expected"]:visible').filter('[name*="choir"]'), actual: $('input[name*="actual"]:visible').filter('[name*="choir"]'), new: $('input[name*="new"]:visible').filter('[name*="choir"]'), returning: $('input[name*="returning"]:visible').filter('[name*="choir"]'), attendanceRate: $('input[name*="attendance"]:visible').filter('[name*="choir"]'), retentionRate: $('input[name*="retention"]:visible').filter('[name*="choir"]'), ratio: $('input[name*="ratio"]:visible').filter('[name*="choir"]') }; // Логируем найденные поля Object.keys(fields).forEach(function(key) { console.log(key + ':', fields[key].attr('name')); }); function calculateChoirMetrics() { var expected = parseFloat(fields.expected.val()) || 0; var actual = parseFloat(fields.actual.val()) || 0; var newP = parseFloat(fields.new.val()) || 0; var returning = parseFloat(fields.returning.val()) || 0; console.log('📊 Calculating:', {expected, actual, newP, returning}); // Attendance Rate if (expected > 0) { var attendanceRate = ((actual / expected) * 100).toFixed(1); fields.attendanceRate.val(attendanceRate); } // Retention Rate if (actual > 0) { var retenti / actual) * 100).toFixed(1); fields.retentionRate.val(retentionRate); } // Ratio if (returning > 0) { var ratio = (newP / returning).toFixed(2); fields.ratio.val("1:" + ratio); } else if (newP > 0) { fields.ratio.val("All new"); } else { fields.ratio.val("No data"); } console.log('✅ Choir calculations completed'); } // Делаем calculated поля read-only fields.attendanceRate.add(fields.retentionRate).add(fields.ratio).attr('readonly', true); // Привязываем события fields.expected.add(fields.actual).add(fields.new).add(fields.returning) .on('input keyup change blur', calculateChoirMetrics); // Первоначальный расчет calculateChoirMetrics(); console.log('🎵 Choir calculations initialized successfully!'); } // Также проверяем периодически (запасной вариант) var checkInterval = setInterval(function() { if (!calculationsActive) { checkAndInitChoir(); } else { clearInterval(checkInterval); } }, 1000); // Очистка через 30 секунд setTimeout(function() { clearInterval(checkInterval); if (observer) observer.disconnect(); }, 30000); });

Mafia Session Data

VolkHauz Game Session Log


jQuery(document).ready(function($) { function calculateMafiaMetrics() { var expected = parseFloat($('input[name="expected_participants_mafia"]').val()) || 0; var actual = parseFloat($('input[name="actual_participants_mafia"]').val()) || 0; var newParticipants = parseFloat($('input[name="new_participants_mafia"]').val()) || 0; var returningParticipants = parseFloat($('input[name="returning_participants_mafia"]').val()) || 0; var newFamilies = parseFloat($('input[name="new_family_units"]').val()) || 0; var returningFamilies = parseFloat($('input[name="returning_family_units"]').val()) || 0; var totalFamilies = newFamilies + returningFamilies; // Attendance Rate if (expected > 0) { var attendanceRate = ((actual / expected) * 100).toFixed(1); $('input[name="mafia_attendance_rate"]').val(attendanceRate); } else { $('input[name="mafia_attendance_rate"]').val('0'); } // Participant Retention Rate if (actual > 0) { var participantRetention = ((returningParticipants / actual) * 100).toFixed(1); $('input[name="participant_retention_rate"]').val(participantRetention); } else { $('input[name="participant_retention_rate"]').val('0'); } // Family Unit Retention Rate if (totalFamilies > 0) { var familyRetention = ((returningFamilies / totalFamilies) * 100).toFixed(1); $('input[name="family_retention_rate"]').val(familyRetention); // Average Family Size var avgFamilySize = (actual / totalFamilies).toFixed(1); $('input[name="average_family_size"]').val(avgFamilySize); } else { $('input[name="family_retention_rate"]').val('0'); $('input[name="average_family_size"]').val('0'); } // New vs Returning Ratio if (returningParticipants > 0) { var ratio = (newParticipants / returningParticipants).toFixed(2); $('input[name="new_returning_ratio"]').val("1:" + ratio); } else if (newParticipants > 0) { $('input[name="new_returning_ratio"]').val("All new"); } else { $('input[name="new_returning_ratio"]').val("No data"); } // Data Validation var participantCheck = (newParticipants + returningParticipants === actual); var familyCheck = (totalFamilies > 0 && actual > 0); var validati; if (participantCheck && familyCheck) { validati; } else { validati; if (!participantCheck) validationStatus += "Participants "; if (!familyCheck) validationStatus += "Families "; } $('input[name="mafia_validation_check"]').val(validationStatus); } // Делаем calculated поля read-only $('input[name="mafia_attendance_rate"], input[name="participant_retention_rate"], input[name="family_retention_rate"], input[name="average_family_size"], input[name="new_returning_ratio"], input[name="mafia_validation_check"]').attr('readonly', true); // Обновление при изменении полей мафии $('input[name="expected_participants_mafia"], input[name="actual_participants_mafia"], input[name="new_participants_mafia"], input[name="returning_participants_mafia"], input[name="new_family_units"], input[name="returning_family_units"]').on('input keyup change', calculateMafiaMetrics); // Первоначальный расчет calculateMafiaMetrics(); });

Dance Session

Zabava Session Log


Demographics & Engagement

Age Distribution (Number of participants):


Gender Distribution (Number of participants):