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
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:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user