Presbyterian Church of Rwanda-EPR has 7 presbyteries.
Kanda Hano! Reba Abakristo Data
No:
Ishuri:
Itorero ry'ibanze: --Hitamo Itorero--
Irangamuntu:
Amazina yombi:
Igitsina: --Hitamo--GaboGore
Irangamimerere: ---Hitamo--- Ingaragu Arubatse Umupfakazi Divorce
Ububatizo: --Hitamo-- Yarabatijwe Ntiyabatijwe
Itariki y'amavuko: --Hitamo Umwaka--
Telephone:
Urwego rw'amashuri yize: ---Hitamo--- Ntazi gusoma Isomero Abanza Ayisumbuye Kaminuza Masters PHD Professor
Icyo akora: ---Hitamo--- Ntakazi agira Arikorera Akorera abandi Akorera leta Akorera NGOs
Subira Inyuma Ohereza
Ishuri:
Itorero ry'ibanze: --Hitamo Itorero--
Irangamuntu:
Amazina yombi:
Igitsina: --Hitamo--GaboGore
Irangamimerere: ---Hitamo--- Ingaragu Arubatse Umupfakazi Divorce
Ububatizo: --Hitamo-- Yarabatijwe Ntiyabatijwe
Itariki y'amavuko: --Hitamo Umwaka--
Telephone:
Urwego rw'amashuri yize: ---Hitamo--- Ntazi gusoma Isomero Abanza Ayisumbuye Kaminuza Masters PHD Professor
Icyo akora: ---Hitamo--- Ntakazi agira Arikorera Akorera abandi Akorera leta Akorera NGOs
Subira Inyuma Ohereza
Izina ry'umukristo:
Irangamimerere:
Uwo bashyingiranwe:
Umwaka bashyingiranwe: --Hitamo Umwaka--
Umubare w'abana:
Irangamimerere:
Uwo bashyingiranwe:
Umwaka bashyingiranwe: --Hitamo Umwaka--
Umubare w'abana:
Amazina y'Abana:
Ongera Umwana
Subira Inyuma
Bika
Sura kuri Presbytery:
--Byose--
Sura kuri Paruwasi:
--Byose--
Reba Abakristo Kuramo CSV Sambaza Reba Archive
Subira Inyuma
Reba Abakristo Kuramo CSV Sambaza Reba Archive
| Presbytery | Paruwasi | Ishuri | Itorero ry'ibanze | No | Irangamuntu | Amazina | Igitsina | Ububatizo | Umwaka w'Amavuko | Telefone | Urwego rw'amashuri | Icyo akora | Amazina y'Abana | Ibikorwa |
|---|
| Presbytery | Paruwasi | Ishuri | Itorero ry'ibanze | No | Irangamuntu | Amazina | Igitsina | Ububatizo | Umwaka w'Amavuko | Telefone | Urwego rw'amashuri | Icyo akora | Amazina y'Abana | Ibikorwa |
|---|
×
Presbytery:
Paruwasi:
Ishuri:
Itorero ry'ibanze:
Urwego rw'amashuri yize: ---Hitamo--- Ntazi gusoma Isomero Abanza Ayisumbuye Kaminuza Masters PHD Professor
Icyo akora: ---Hitamo--- Ntakazi agira Arikorera Akorera abandi Akorera leta Akorera NGOs
Uwo bashyingiranwe:
Umwaka bashyingiranwe: --Hitamo Umwaka--
Umubare w'abana:
<script>
// Data
let members = [];
let archive = [];
try {
members = JSON.parse(localStorage.getItem('members')) || [];
archive = JSON.parse(localStorage.getItem('archive')) || [];
// Migrate existing data to include education, job, and family fields
members = members.map(m => ({
...m,
education: m.education || '',
job: m.job || '',
maritalStatus: m.maritalStatus || '',
spouse: m.spouse || '',
marriageYear: m.marriageYear || '',
children: m.children || '0',
childNames: m.childNames || [] // New field for child names
}));
archive = archive.map(m => ({
...m,
education: m.education || '',
job: m.job || '',
maritalStatus: m.maritalStatus || '',
spouse: m.spouse || '',
marriageYear: m.marriageYear || '',
children: m.children || '0',
childNames: m.childNames || []
}));
localStorage.setItem('members', JSON.stringify(members));
localStorage.setItem('archive', JSON.stringify(archive));
} catch (e) {
console.error('Error accessing localStorage:', e);
}
let currentPresbytery = '', currentParish = '';
let editingIndex = -1;
let transferIndex = -1;
let familyEditIndex = -1;
const presbyteries = {
"GISENYI": ["Gacuba", "Kayove", "Rugarama", "Karisimbi", "Kigarama", "Bushaka", "Rubavu", "Kinanira", "Nyabirasi", "Mukingo", "Kijote", "Nkuri", "Gahondogo", "Ruhengeri", "Kidaho", "Nyarutovu", "Ramba", "Mutake", "Karambo", "Giciye", "Nganzo", "Buganamana"],
"KIGALI": ["Kamuhoza", "Kacyiru", "Kigali-Central"],
"RUBENGERA": ["Sure", "Rubengera", "Gashashi"],
"KIRINDA": ["Kuruganda", "Kirinda-Central", "Ngoma"],
"GITARAMA": ["Mututu", "Kabgayi", "Nyamagana"],
"REMERA": ["Bubazi", "Remera-Central", "Ndera"],
"ZINGA": ["Kibungo", "Rukira", "Gahini"]
};
const schools = ["Gacuba", "Kabirizi", "Rugerero", "Basa"];
const localChurches = {
"Gacuba": ["Gikarani", "Nengo", "Nyakabungo", "Makoro", "Mbugangali", "Buhuru", "Kanembwe"],
"Kabirizi": ["Kiroji", "Rohero"],
"Rugerero": ["Pfunda", "Rugerero", "Ruhangiro", "Gisa"],
"Basa": ["Nyaruhengeri", "Gahinga", "Mwumba"]
};
// DOM Elements
const startBtn = document.getElementById('startBtn');
const viewDataBtn = document.getElementById('viewDataBtn');
const presbyteriesPage = document.getElementById('presbyteriesPage');
const memberFormPage = document.getElementById('memberFormPage');
const dataPage = document.getElementById('dataPage');
const familyInfoPage = document.getElementById('familyInfoPage');
const presbyList = document.getElementById('presbyList');
const backToMain = document.getElementById('backToMain');
const backToPresby = document.getElementById('backToPresby');
const backToMainFromData = document.getElementById('backToMainFromData');
const backToDataFromFamily = document.getElementById('backToDataFromFamily');
const schoolSelect = document.getElementById('schoolSelect');
const schoolSelect2 = document.getElementById('schoolSelect2');
const yearSelect = document.getElementById('yearSelect');
const educationSelect = document.getElementById('educationSelect');
const jobStatusSelect = document.getElementById('jobStatusSelect');
const familyForm = document.getElementById('familyForm');
const familyName = document.getElementById('familyName');
const familyMaritalStatus = document.getElementById('familyMaritalStatus');
const spouseInput = document.getElementById('spouseInput');
const marriageYearSelect = document.getElementById('marriageYearSelect');
const childrenInput = document.getElementById('childrenInput');
const childrenNamesContainer = document.getElementById('childrenNamesContainer');
const addChildNameBtn = document.getElementById('addChildName');
const filterPresby = document.getElementById('filterPresby');
const filterParish = document.getElementById('filterParish');
const tableBody = document.getElementById('memberTableBody');
const tableContainer = document.getElementById('memberListContainer');
const archivePage = document.getElementById('archivePage');
const archiveTableBody = document.getElementById('archiveTableBody');
const backFromArchive = document.getElementById('backFromArchive');
const openArchiveBtn = document.getElementById('openArchiveBtn');
const overlay = document.getElementById('overlay');
const transferModal = document.getElementById('transferModal');
const transferPresby = document.getElementById('transferPresby');
const transferParish = document.getElementById('transferParish');
const transferSchool = document.getElementById('transferSchool');
const transferSchool2 = document.getElementById('transferSchool2');
const transferEducation = document.getElementById('transferEducation');
const transferJob = document.getElementById('transferJob');
const transferSpouse = document.getElementById('transferSpouse');
const transferMarriageYear = document.getElementById('transferMarriageYear');
const transferChildren = document.getElementById('transferChildren');
const transferChildrenNamesContainer = document.getElementById('transferChildrenNamesContainer');
const addTransferChildNameBtn = document.getElementById('addTransferChildName');
const transferSave = document.getElementById('transferSave');
const transferCancel = document.getElementById('transferCancel');
const closeTransfer = document.getElementById('closeTransfer');
const autoNoField = document.getElementById('autoNo');
const memberForm = document.getElementById('memberForm');
// Populate dropdowns
schools.forEach(s => {
let o = document.createElement('option');
o.textContent = s;
o.value = s;
schoolSelect.appendChild(o);
let t = document.createElement('option');
t.textContent = s;
t.value = s;
transferSchool.appendChild(t);
});
function updateLocalChurchesDropdown() {
schoolSelect2.innerHTML = '--Hitamo Itorero--';
const selectedSchool = schoolSelect.value;
if (selectedSchool && localChurches[selectedSchool]) {
localChurches[selectedSchool].forEach(c => {
let o = document.createElement('option');
o.textContent = c;
o.value = c;
schoolSelect2.appendChild(o);
});
}
}
schoolSelect.onchange = updateLocalChurchesDropdown;
for (let y = 1900; y <= 2025; y++) {
let o = document.createElement('option');
o.textContent = y;
o.value = y;
yearSelect.appendChild(o);
let m = document.createElement('option');
m.textContent = y;
m.value = y;
marriageYearSelect.appendChild(m);
let t = document.createElement('option');
t.textContent = y;
t.value = y;
transferMarriageYear.appendChild(t);
}
Object.keys(presbyteries).forEach(p => {
let o = document.createElement('option');
o.textContent = p;
o.value = p;
filterPresby.appendChild(o);
});
// Generate unique member number
function getNextMemberNo() {
const allNos = [...members, ...archive].map(m => parseInt(m.no)).filter(n => !isNaN(n));
return allNos.length ? Math.max(...allNos) + 1 : 1;
}
// Dynamic Child Name Inputs for Family Form
function updateChildNameInputs(numChildren, existingNames = []) {
childrenNamesContainer.innerHTML = 'Amazina y\'Abana:Paruwasi:
Ishuri:
Itorero ry'ibanze:
Urwego rw'amashuri yize: ---Hitamo--- Ntazi gusoma Isomero Abanza Ayisumbuye Kaminuza Masters PHD Professor
Icyo akora: ---Hitamo--- Ntakazi agira Arikorera Akorera abandi Akorera leta Akorera NGOs
Uwo bashyingiranwe:
Umwaka bashyingiranwe: --Hitamo Umwaka--
Umubare w'abana:
Amazina y'Abana:
Ongera Umwana
Bika
Hagarika
'; for (let i = 0; i < numChildren; i++) { const input = document.createElement('input'); input.type = 'text'; input.placeholder = `Izina ry'Umwana ${i + 1}`; input.value = existingNames[i] || ''; input.className = 'child-name-input'; input.setAttribute('aria-label', `Izina ry'Umwana ${i + 1}`); childrenNamesContainer.appendChild(input); childrenNamesContainer.appendChild(document.createElement('br')); } } childrenInput.addEventListener('change', function() { const numChildren = parseInt(childrenInput.value) || 0; updateChildNameInputs(numChildren, members[familyEditIndex]?.childNames || []); }); addChildNameBtn.onclick = function() { const numChildren = parseInt(childrenInput.value) || 0; childrenInput.value = numChildren + 1; updateChildNameInputs(numChildren + 1, members[familyEditIndex]?.childNames || []); }; // Dynamic Child Name Inputs for Transfer Modal function updateTransferChildNameInputs(numChildren, existingNames = []) { transferChildrenNamesContainer.innerHTML = 'Amazina y\'Abana:
'; for (let i = 0; i < numChildren; i++) { const input = document.createElement('input'); input.type = 'text'; input.placeholder = `Izina ry'Umwana ${i + 1}`; input.value = existingNames[i] || ''; input.className = 'transfer-child-name-input'; input.setAttribute('aria-label', `Izina ry'Umwana ${i + 1}`); transferChildrenNamesContainer.appendChild(input); transferChildrenNamesContainer.appendChild(document.createElement('br')); } } transferChildren.addEventListener('change', function() { const numChildren = parseInt(transferChildren.value) || 0; updateTransferChildNameInputs(numChildren, members[transferIndex]?.childNames || []); }); addTransferChildNameBtn.onclick = function() { const numChildren = parseInt(transferChildren.value) || 0; transferChildren.value = numChildren + 1; updateTransferChildNameInputs(numChildren + 1, members[transferIndex]?.childNames || []); }; // Navigation startBtn.onclick = () => { startBtn.classList.add('hidden'); viewDataBtn.classList.add('hidden'); presbyteriesPage.classList.remove('hidden'); renderPresbyteries(); }; backToMain.onclick = () => { presbyteriesPage.classList.add('hidden'); startBtn.classList.remove('hidden'); viewDataBtn.classList.remove('hidden'); }; viewDataBtn.onclick = () => { startBtn.classList.add('hidden'); viewDataBtn.classList.add('hidden'); dataPage.classList.remove('hidden'); updateFilterParish(); renderTable(); renderChart(); }; backToMainFromData.onclick = () => { dataPage.classList.add('hidden'); tableContainer.classList.add('hidden'); startBtn.classList.remove('hidden'); viewDataBtn.classList.remove('hidden'); }; backToPresby.onclick = () => { memberFormPage.classList.add('hidden'); presbyteriesPage.classList.remove('hidden'); }; backToDataFromFamily.onclick = () => { familyInfoPage.classList.add('hidden'); dataPage.classList.remove('hidden'); tableContainer.classList.remove('hidden'); renderTable(); }; // Render presbyteries function renderPresbyteries() { presbyList.innerHTML = ''; for (const presby in presbyteries) { const p = document.createElement('p'); p.innerHTML = `${presby}`; presbyList.appendChild(p); const label = document.createElement('label'); label.textContent = 'Hitamo Paruwasi:'; presbyList.appendChild(label); const select = document.createElement('select'); select.setAttribute('aria-label', `Hitamo Paruwasi ya ${presby}`); const defaultOpt = document.createElement('option'); defaultOpt.value = ''; defaultOpt.textContent = '--Hitamo--'; select.appendChild(defaultOpt); presbyteries[presby].forEach(parish => { let o = document.createElement('option'); o.value = parish; o.textContent = parish; select.appendChild(o); }); select.onchange = function() { if (this.value) { currentPresbytery = presby; currentParish = this.value; memberFormPage.classList.remove('hidden'); presbyteriesPage.classList.add('hidden'); if (editingIndex < 0) autoNoField.value = getNextMemberNo(); updateLocalChurchesDropdown(); } }; presbyList.appendChild(select); } } // Member Form Submit memberForm.addEventListener('submit', function(e) { e.preventDefault(); const idInput = document.getElementById('idInput').value; if (members.some(m => m.id === idInput && members.indexOf(m) !== editingIndex)) { alert('Irangamuntu iri mu bice byabitswe! Hitamo irindi.'); return; } const selectedSchool = document.getElementById('schoolSelect').value; const selectedLocalChurch = document.getElementById('schoolSelect2').value; const selectedEducation = document.getElementById('educationSelect').value; const selectedJob = document.getElementById('jobStatusSelect').value; const selectedMaritalStatus = document.getElementById('MartalstatusSelect').value; if (!selectedSchool || !selectedLocalChurch || !selectedEducation || !selectedJob) { alert('Ugomba guhitamo Ishuri, Itorero ry\'ibanze, Urwego rw\'amashuri, na Icyo akora!'); return; } const memberData = { presbytery: currentPresbytery, parish: currentParish, no: autoNoField.value, school: selectedSchool, school2: selectedLocalChurch, id: idInput, name: document.getElementById('nameInput').value, gender: document.getElementById('genderSelect').value, maritalStatus: selectedMaritalStatus, baptism: document.getElementById('baptismSelect').value, birthYear: document.getElementById('yearSelect').value, phone: document.getElementById('phoneInput').value, education: selectedEducation, job: selectedJob, spouse: '', marriageYear: '', children: '0', childNames: [] }; if (editingIndex >= 0) { memberData.spouse = members[editingIndex].spouse || ''; memberData.marriageYear = members[editingIndex].marriageYear || ''; memberData.children = members[editingIndex].children || '0'; memberData.childNames = members[editingIndex].childNames || []; members[editingIndex] = memberData; editingIndex = -1; alert('Amakuru yahinduwe!'); } else { members.push(memberData); alert('Amakuru yabitswe!'); } try { localStorage.setItem('members', JSON.stringify(members)); } catch (e) { console.error('Error saving to localStorage:', e); } memberForm.reset(); autoNoField.value = getNextMemberNo(); updateFilterParish(); renderTable(); renderChart(); }); // Family Form Submit familyForm.addEventListener('submit', function(e) { e.preventDefault(); if (familyEditIndex >= 0) { const maritalStatus = members[familyEditIndex].maritalStatus; const spouse = spouseInput.value; const marriageYear = marriageYearSelect.value; const children = childrenInput.value || '0'; const childNames = Array.from(document.querySelectorAll('.child-name-input')).map(input => input.value.trim()).filter(name => name !== ''); if ((maritalStatus === 'arubatse' || maritalStatus === 'divorce') && marriageYear === '') { alert('Igihe bashyingiranwe kirakenewe iyo irangamimerere ni Arubatse cyangwa Divorce!'); return; } if (parseInt(children) < childNames.length) { alert('Umubare w\'abana ugomba kuba fungana na amazina yabana wuzuye!'); return; } members[familyEditIndex].spouse = spouse; members[familyEditIndex].marriageYear = marriageYear; members[familyEditIndex].children = children; members[familyEditIndex].childNames = childNames; try { localStorage.setItem('members', JSON.stringify(members)); } catch (e) { console.error('Error saving to localStorage:', e); } alert('Amakuru y\'umuryango yabitswe!'); familyForm.reset(); updateChildNameInputs(0); familyInfoPage.classList.add('hidden'); dataPage.classList.remove('hidden'); tableContainer.classList.remove('hidden'); renderTable(); } }); // Render Members Table with Pagination function renderTable(page = 1, pageSize = 10) { const presbyFilter = filterPresby.value; const parishFilter = filterParish.value; tableBody.innerHTML = ''; const filtered = members.filter(m => (presbyFilter === '' || m.presbytery === presbyFilter) && (parishFilter === '' || m.parish === parishFilter) ); const start = (page - 1) * pageSize; const end = start + pageSize; const paginated = filtered.slice(start, end); if (paginated.length === 0) { const tr = document.createElement('tr'); const td = document.createElement('td'); td.colSpan = 15; td.textContent = 'Nta makuru yabitswe'; tr.appendChild(td); tableBody.appendChild(tr); } else { paginated.forEach((m, index) => { const tr = document.createElement('tr'); ['presbytery', 'parish', 'school', 'school2', 'no', 'id', 'name', 'gender', 'baptism', 'birthYear', 'phone', 'education', 'job', 'childNames'].forEach(key => { const td = document.createElement('td'); td.textContent = key === 'childNames' ? (m[key] || []).join(', ') : m[key] || ''; tr.appendChild(td); }); const tdActions = document.createElement('td'); const editBtn = document.createElement('button'); editBtn.textContent = 'Hindura'; editBtn.className = 'action-btn'; editBtn.setAttribute('aria-label', `Hindura amakuru ya ${m.name}`); editBtn.onclick = function() { autoNoField.value = m.no; document.getElementById('schoolSelect').value = m.school; updateLocalChurchesDropdown(); document.getElementById('schoolSelect2').value = m.school2; document.getElementById('idInput').value = m.id; document.getElementById('nameInput').value = m.name; document.getElementById('genderSelect').value = m.gender; document.getElementById('MartalstatusSelect').value = m.maritalStatus; document.getElementById('baptismSelect').value = m.baptism; document.getElementById('yearSelect').value = m.birthYear; document.getElementById('phoneInput').value = m.phone; document.getElementById('educationSelect').value = m.education || ''; document.getElementById('jobStatusSelect').value = m.job || ''; currentPresbytery = m.presbytery; currentParish = m.parish; editingIndex = members.indexOf(m); memberFormPage.classList.remove('hidden'); dataPage.classList.add('hidden'); }; tdActions.appendChild(editBtn); const delBtn = document.createElement('button'); delBtn.textContent = 'Siba'; delBtn.className = 'action-btn'; delBtn.setAttribute('aria-label', `Siba amakuru ya ${m.name}`); delBtn.onclick = function() { if (confirm(`Urashaka gusiba ${m.name}?`)) { members.splice(members.indexOf(m), 1); try { localStorage.setItem('members', JSON.stringify(members)); } catch (e) { console.error('Error saving to localStorage:', e); } renderTable(page); renderChart(); } }; tdActions.appendChild(delBtn); const archBtn = document.createElement('button'); archBtn.textContent = 'Bika mu Bubiko'; archBtn.className = 'action-btn'; archBtn.setAttribute('aria-label', `Bika ${m.name} mu bubiko`); archBtn.onclick = function() { archive.push(m); members.splice(members.indexOf(m), 1); try { localStorage.setItem('members', JSON.stringify(members)); localStorage.setItem('archive', JSON.stringify(archive)); } catch (e) { console.error('Error saving to localStorage:', e); } renderTable(page); renderChart(); }; tdActions.appendChild(archBtn); const transBtn = document.createElement('button'); transBtn.textContent = 'Ohereza'; transBtn.className = 'action-btn'; transBtn.setAttribute('aria-label', `Ohereza ${m.name} ku yandi paruwasi`); transBtn.onclick = function() { transferIndex = members.indexOf(m); openTransferModal(m); }; tdActions.appendChild(transBtn); const familyBtn = document.createElement('button'); familyBtn.textContent = 'Umuryango'; familyBtn.className = 'action-btn'; familyBtn.setAttribute('aria-label', `Reba amakuru y'umuryango ya ${m.name}`); familyBtn.onclick = function() { familyEditIndex = members.indexOf(m); familyName.value = m.name; familyMaritalStatus.value = m.maritalStatus || ''; spouseInput.value = m.spouse || ''; marriageYearSelect.value = m.marriageYear || ''; childrenInput.value = m.children || '0'; updateChildNameInputs(parseInt(m.children) || 0, m.childNames || []); dataPage.classList.add('hidden'); familyInfoPage.classList.remove('hidden'); }; tdActions.appendChild(familyBtn); tr.appendChild(tdActions); tableBody.appendChild(tr); }); } const pagination = document.getElementById('pagination'); pagination.innerHTML = ` Ibanze Page ${page} = filtered.length ? 'disabled' : ''} aria-label="Genda ku ipage rikurikira">Ibikurikira `; } // Filter Parish function updateFilterParish() { filterParish.innerHTML = ''; let defaultOpt = document.createElement('option'); defaultOpt.value = ''; defaultOpt.textContent = '--Byose--'; filterParish.appendChild(defaultOpt); const presby = filterPresby.value; let parishesList = []; if (presby === '') { for (let p in presbyteries) { parishesList = parishesList.concat(presbyteries[p]); } } else { parishesList = presbyteries[presby]; } parishesList.forEach(par => { let o = document.createElement('option'); o.value = par; o.textContent = par; filterParish.appendChild(o); }); } filterPresby.onchange = () => { updateFilterParish(); renderTable(); }; filterParish.onchange = () => { renderTable(); }; // Toggle Table document.getElementById('toggleView').onclick = function() { if (tableContainer.classList.contains('hidden')) { tableContainer.classList.remove('hidden'); renderTable(); } else { tableContainer.classList.add('hidden'); } }; // CSV Download document.getElementById('downloadCSV').onclick = function() { if (members.length === 0) { alert('Nta makuru yabitswe'); return; } const csvHeader = [...Object.keys(members[0]).filter(k => k !== 'childNames'), 'childNames'].join(',') + '\n'; const csvRows = members.map(m => { const values = Object.values(m).map((v, i) => { if (Object.keys(m)[i] === 'childNames') { return `"${(v || []).join(';')}"`; } return `"${v || ''}"`; }); return values.join(','); }).join('\n'); const bom = '\uFEFF'; const blob = new Blob([bom + csvHeader + csvRows], { type: 'text/csv;charset=utf-8' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'abakristo.csv'; a.click(); URL.revokeObjectURL(url); }; // Share document.getElementById('shareData').onclick = function() { if (members.length === 0) { alert('Nta makuru yabitswe'); return; } const textData = members.map(m => `${m.no} - ${m.name} - ${m.school} - ${m.school2} - ${m.education} - ${m.job} - ${m.spouse || ''} - ${m.marriageYear || ''} - ${m.children || '0'} - ${(m.childNames || []).join(', ')}` ).join('\n'); if (navigator.share) { navigator.share({ title: 'Abakristo Data', text: textData }).catch(console.error); } else { alert('Sambaza ntishyigikirwa'); } }; // Archive Page openArchiveBtn.onclick = function() { dataPage.classList.add('hidden'); archivePage.classList.remove('hidden'); renderArchive(); }; backFromArchive.onclick = function() { archivePage.classList.add('hidden'); dataPage.classList.remove('hidden'); }; function renderArchive() { archiveTableBody.innerHTML = ''; if (archive.length === 0) { const tr = document.createElement('tr'); const td = document.createElement('td'); td.colSpan = 15; td.textContent = 'Nta makuru mu bubiko'; tr.appendChild(td); archiveTableBody.appendChild(tr); return; } archive.forEach(m => { const tr = document.createElement('tr'); ['presbytery', 'parish', 'school', 'school2', 'no', 'id', 'name', 'gender', 'baptism', 'birthYear', 'phone', 'education', 'job', 'childNames'].forEach(k => { let td = document.createElement('td'); td.textContent = k === 'childNames' ? (m[k] || []).join(', ') : m[k] || ''; tr.appendChild(td); }); const tdActions = document.createElement('td'); const resBtn = document.createElement('button'); resBtn.textContent = 'Garura'; resBtn.setAttribute('aria-label', `Garura ${m.name} mu bubiko`); resBtn.onclick = function() { members.push(m); archive.splice(archive.indexOf(m), 1); try { localStorage.setItem('members', JSON.stringify(members)); localStorage.setItem('archive', JSON.stringify(archive)); } catch (e) { console.error('Error saving to localStorage:', e); } renderArchive(); renderChart(); }; tdActions.appendChild(resBtn); tr.appendChild(tdActions); archiveTableBody.appendChild(tr); }); } // Transfer function openTransferModal(m) { overlay.classList.remove('hidden'); transferModal.classList.remove('hidden'); transferPresby.innerHTML = ''; Object.keys(presbyteries).forEach(p => { let o = document.createElement('option'); o.value = p; o.textContent = p; transferPresby.appendChild(o); }); transferPresby.value = m.presbytery; transferPresby.onchange = function() { transferParish.innerHTML = ''; presbyteries[transferPresby.value].forEach(par => { let o = document.createElement('option'); o.value = par; o.textContent = par; transferParish.appendChild(o); }); }; transferPresby.onchange(); transferParish.value = m.parish; transferSchool.innerHTML = ''; schools.forEach(s => { let o = document.createElement('option'); o.value = s; o.textContent = s; transferSchool.appendChild(o); }); transferSchool.value = m.school; transferSchool2.innerHTML = '--Hitamo Itorero--'; if (m.school && localChurches[m.school]) { localChurches[m.school].forEach(c => { let o = document.createElement('option'); o.value = c; o.textContent = c; transferSchool2.appendChild(o); }); } transferSchool2.value = m.school2; transferEducation.value = m.education || ''; transferJob.value = m.job || ''; transferSpouse.value = m.spouse || ''; transferMarriageYear.value = m.marriageYear || ''; transferChildren.value = m.children || '0'; updateTransferChildNameInputs(parseInt(m.children) || 0, m.childNames || []); transferSchool.onchange = function() { transferSchool2.innerHTML = '--Hitamo Itorero--'; const selectedSchool = transferSchool.value; if (selectedSchool && localChurches[selectedSchool]) { localChurches[selectedSchool].forEach(c => { let o = document.createElement('option'); o.value = c; o.textContent = c; transferSchool2.appendChild(o); }); } }; } transferSave.onclick = function() { if (transferIndex >= 0) { const selectedSchool = transferSchool.value; const selectedLocalChurch = transferSchool2.value; const selectedEducation = transferEducation.value; const selectedJob = transferJob.value; const selectedSpouse = transferSpouse.value; const selectedMarriageYear = transferMarriageYear.value; const selectedChildren = transferChildren.value || '0'; const selectedChildNames = Array.from(document.querySelectorAll('.transfer-child-name-input')).map(input => input.value.trim()).filter(name => name !== ''); if (!selectedSchool || !selectedLocalChurch || !selectedEducation || !selectedJob) { alert('Ugomba guhitamo Ishuri, Itorero ry\'ibanze, Urwego rw\'amashuri, na Icyo akora!'); return; } if ((members[transferIndex].maritalStatus === 'arubatse' || members[transferIndex].maritalStatus === 'divorce') && selectedMarriageYear === '') { alert('Igihe bashyingiranwe kirakenewe iyo irangamimerere ni Arubatse cyangwa Divorce!'); return; } if (parseInt(selectedChildren) < selectedChildNames.length) { alert('Umubare w\'abana ugomba kuba fungana na amazina yabana wuzuye!'); return; } members[transferIndex].presbytery = transferPresby.value; members[transferIndex].parish = transferParish.value; members[transferIndex].school = selectedSchool; members[transferIndex].school2 = selectedLocalChurch; members[transferIndex].education = selectedEducation; members[transferIndex].job = selectedJob; members[transferIndex].spouse = selectedSpouse; members[transferIndex].marriageYear = selectedMarriageYear; members[transferIndex].children = selectedChildren; members[transferIndex].childNames = selectedChildNames; try { localStorage.setItem('members', JSON.stringify(members)); } catch (e) { console.error('Error saving to localStorage:', e); } alert('Kohereza byagenze neza!'); renderChart(); } transferIndex = -1; closeTransferModal(); renderTable(); }; transferCancel.onclick = closeTransferModal; closeTransfer.onclick = closeTransferModal; function closeTransferModal() { overlay.classList.add('hidden'); transferModal.classList.add('hidden'); } // Render Bar Chart let chartInstance = null; function renderChart() { const ctx = document.getElementById('memberChart').getContext('2d'); const presbyCounts = Object.keys(presbyteries).map(presby => ({ presby, count: members.filter(m => m.presbytery === presby).length })); const labels = presbyCounts.map(p => p.presby); const data = presbyCounts.map(p => p.count); if (chartInstance) { chartInstance.destroy(); } chartInstance = new Chart(ctx, { type: 'bar', data: { labels: labels, datasets: [{ label: 'Umubare w’Abakristo muri Presbytery', data: data, backgroundColor: '#12984c', borderColor: '#1ac564', borderWidth: 1 }] }, options: { scales: { y: { beginAtZero: true, title: { display: true, text: 'Umubare w’Abakristo' } }, x: { title: { display: true, text: 'Presbytery' } } }, plugins: { legend: { display: true } } } }); } // Initial updateFilterParish(); renderTable(); renderChart(); </script>