Replace all mock data in admin and board pages with real data
All checks were successful
Build And Push Image / docker (push) Successful in 1m56s

- Admin members page now loads real member data from NocoDB API
- Admin users page fetches actual users from Keycloak with tier determination
- Board members page uses real member data with proper transformations
- Admin payments page generates payment records from dues tracking data
- Created new /api/admin/users endpoint for Keycloak user management
- All stats cards now calculate from real data instead of hardcoded values
- Removed all mock/placeholder data arrays from production pages

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-08-31 18:43:04 +02:00
parent 1aef356d78
commit 70e79d2618
8 changed files with 601 additions and 508 deletions

View File

@@ -408,74 +408,8 @@ const headers = [
{ title: 'Actions', key: 'actions', sortable: false, align: 'center' }
];
// Mock members data
const members = ref([
{
id: 1,
memberId: 'MUSA-0001',
firstName: 'John',
lastName: 'Doe',
email: 'john.doe@example.com',
phone: '+1 234 567 8900',
status: 'Active',
duesStatus: 'Paid',
memberType: 'Premium',
joinDate: '2021-03-15',
nationality: 'United States'
},
{
id: 2,
memberId: 'MUSA-0002',
firstName: 'Jane',
lastName: 'Smith',
email: 'jane.smith@example.com',
phone: '+1 234 567 8901',
status: 'Active',
duesStatus: 'Pending',
memberType: 'Regular',
joinDate: '2022-06-20',
nationality: 'United Kingdom'
},
{
id: 3,
memberId: 'MUSA-0003',
firstName: 'Pierre',
lastName: 'Dupont',
email: 'pierre.dupont@example.com',
phone: '+33 6 12 34 56 78',
status: 'Active',
duesStatus: 'Paid',
memberType: 'Board',
joinDate: '2020-01-10',
nationality: 'France'
},
{
id: 4,
memberId: 'MUSA-0004',
firstName: 'Maria',
lastName: 'Rossi',
email: 'maria.rossi@example.com',
phone: '+39 06 123 4567',
status: 'Inactive',
duesStatus: 'Overdue',
memberType: 'Regular',
joinDate: '2021-09-05',
nationality: 'Italy'
},
{
id: 5,
memberId: 'MUSA-0005',
firstName: 'Hans',
lastName: 'Mueller',
email: 'hans.mueller@example.com',
phone: '+49 30 12345678',
status: 'Active',
duesStatus: 'Paid',
memberType: 'Premium',
joinDate: '2022-02-28',
nationality: 'Germany'
}
]);
// Real members data from API
const members = ref([]);
// New member form
const newMember = ref({
@@ -589,6 +523,44 @@ const addMember = () => {
joinDate: new Date().toISOString().split('T')[0]
};
};
// Load real members data from API
const loadMembers = async () => {
loading.value = true;
try {
// Fetch members from API
const { data } = await $fetch('/api/members');
if (data?.members) {
// Transform the data to match our interface
members.value = data.members.map((member: any) => ({
id: member.Id || member.id,
memberId: member.member_id || `MUSA-${String(member.Id).padStart(4, '0')}`,
firstName: member.first_name,
lastName: member.last_name,
email: member.email,
phone: member.phone_number || member.phone || '',
status: member.membership_status === 'Active' ? 'Active' : 'Inactive',
duesStatus: member.dues_status || 'Unknown',
memberType: member.membership_type || 'Regular',
joinDate: member.member_since || member.created_at,
nationality: member.nationality || member.country || ''
}));
console.log(`[board-members] Loaded ${members.value.length} members from API`);
}
} catch (error) {
console.error('Error loading members:', error);
// Keep empty array if load fails
} finally {
loading.value = false;
}
};
// Load data on mount
onMounted(async () => {
await loadMembers();
});
</script>
<style scoped>