Compare commits

..

2 Commits

Author SHA1 Message Date
Sascha Kühl ccc3ffe771 removed unused import 2025-05-30 15:39:52 +02:00
Sascha Kühl cead31cc90 progress on player view 2025-05-30 15:39:14 +02:00
4 changed files with 59 additions and 41 deletions

View File

@ -1,6 +1,6 @@
import { createRouter, createWebHistory } from '@ionic/vue-router'; import { createRouter, createWebHistory } from '@ionic/vue-router';
import { useStore } from 'vuex' import { useStore } from 'vuex'
import { RouteRecordRaw, RouteLocationNormalizedGeneric } from 'vue-router'; import { RouteRecordRaw } from 'vue-router';
import PlayerList from '../views/PlayerList.vue' import PlayerList from '../views/PlayerList.vue'
import PlayerView from '../views/PlayerView.vue' import PlayerView from '../views/PlayerView.vue'
import LoginView from '../views/LoginView.vue' import LoginView from '../views/LoginView.vue'
@ -23,14 +23,9 @@ const routes: Array<RouteRecordRaw> = [
{ path: '/bullpen', component: BullpenView }, { path: '/bullpen', component: BullpenView },
{ path: '/stats', component: BullpenListView }, { path: '/stats', component: BullpenListView },
{ path: '/summary', component: BullpenSummaryView }, { path: '/summary', component: BullpenSummaryView },
{ { path: '/player/create', name: 'PlayerCreate', component: PlayerView },
path: '/player', { path: '/player/view/:id', name: 'PlayerView', component: PlayerView },
component: PlayerView, { path: '/player/edit/:id', name: 'PlayerEdit', component: PlayerView }
props: (route: RouteLocationNormalizedGeneric) => ({
id: route.query.id
}),
},
] ]
const router = createRouter({ const router = createRouter({

View File

@ -38,7 +38,7 @@ const showStats = () => {
}; };
const showProfile = () => { const showProfile = () => {
router.push({ path: '/player', query: { id: user.value.id }}); router.push({ path: `/player/view/${user.value.id}`});
}; };
const logout = () => { const logout = () => {
@ -50,7 +50,7 @@ const logout = () => {
} }
const addPlayer = () => { const addPlayer = () => {
router.push({ path: '/player' }); router.push({ path: '/player/create' });
} }
</script> </script>

View File

@ -17,6 +17,7 @@ onMounted(async () => {
const selectPlayer = (player: Player) => { const selectPlayer = (player: Player) => {
console.log(player); console.log(player);
store.commit("player/select", player); store.commit("player/select", player);
store.dispatch("bullpen/start", player.user);
router.push({ path: '/bullpen' }); router.push({ path: '/bullpen' });
}; };

View File

@ -18,19 +18,19 @@ import {
import { Field, useForm } from 'vee-validate'; import { Field, useForm } from 'vee-validate';
import * as yup from 'yup'; import * as yup from 'yup';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { ref, onMounted, watch } from 'vue'; import { computed, ref, onMounted } from 'vue';
import Player from '@/types/Player'; import Player from '@/types/Player';
// import CrudField from '@/components/CrudField.vue' // import CrudField from '@/components/CrudField.vue'
import PlayerService from '@/services/PlayerService'; import PlayerService from '@/services/PlayerService';
import {useRoute} from 'vue-router'; import {useRoute, useRouter} from 'vue-router';
const props = defineProps<{ player?: Player }>(); const props = defineProps<{ player?: Player }>();
const defaultPlayer: Player = { const defaultPlayer: Player = {
id: 0, id: 0,
gender: 'male', gender: 'male',
bats: 'R', bats: 'right',
throws: 'R', throws: 'right',
height: 0, height: 0,
weight: 0, weight: 0,
state: 'active', state: 'active',
@ -54,8 +54,17 @@ const defaultPlayer: Player = {
// Computed reactive player object: Either use the provided player or initialize with default // Computed reactive player object: Either use the provided player or initialize with default
const player = ref<Player>(props.player ? { ...props.player } : { ...defaultPlayer }); const player = ref<Player>(props.player ? { ...props.player } : { ...defaultPlayer });
const isEdit = ref(false);
const route = useRoute(); const route = useRoute();
const router = useRouter();
const id = route.params.id as string | undefined; // `id` parameter from route
const mode = computed(() => {
if (route.name === 'PlayerCreate') return 'create';
if (route.name === 'PlayerView') return 'view';
if (route.name === 'PlayerEdit') return 'edit';
return null; // Fallback for unsupported routes
});
const formattedDate = ref(player.value.user.dateOfBirth.toISOString().split('T')[0]); const formattedDate = ref(player.value.user.dateOfBirth.toISOString().split('T')[0]);
const schema = yup.object({ const schema = yup.object({
@ -102,40 +111,49 @@ const { errors, resetForm, handleSubmit, defineField } = useForm({
}); });
// Watch for changes in props.player to reset form when editing // Watch for changes in props.player to reset form when editing
watch( // watch(
() => route.params.id || route.query.id, // () => route.params.id || route.query.id,
(newId) => { // (newId) => {
if (newId) { // if (newId) {
fetchPlayerById(Number(newId)); // Fetch player when the ID changes // fetchPlayerById(Number(newId)); // Fetch player when the ID changes
} // }
} // }
); // );
onMounted(() => { onMounted(() => {
const id = route.params.id || route.query.id; // Get ID from params or query if (mode.value === 'view' || mode.value === 'edit') {
if (id) { PlayerService.fetchById(Number(id))
fetchPlayerById(Number(id)); .then((response) => {
player.value = response;
})
.catch((error) => {
console.error('Failed to fetch player:', error);
});
} }
});
const fetchPlayerById = async (id: number) => {
try {
const data = await PlayerService.fetchByUserId(id); // Fetch the player from the API
player.value = { ...data }; // Load the API response into the form
resetForm({ values: { ...player.value } }); // Reset form with fetched data resetForm({ values: { ...player.value } }); // Reset form with fetched data
formattedDate.value = dayjs(player.value.user.dateOfBirth).format('YYYY-MM-DD'); formattedDate.value = dayjs(player.value.user.dateOfBirth).format('YYYY-MM-DD');
isEdit.value = true; // Set to edit mode });
} catch (error) {
console.error('Error fetching player data:', error); // const fetchPlayerById = async (id: number) => {
} // try {
}; // const data = await PlayerService.fetchByUserId(id); // Fetch the player from the API
// player.value = { ...data }; // Load the API response into the form
// resetForm({ values: { ...player.value } }); // Reset form with fetched data
// formattedDate.value = dayjs(player.value.user.dateOfBirth).format('YYYY-MM-DD');
// isEdit.value = true; // Set to edit mode
// } catch (error) {
// console.error('Error fetching player data:', error);
// }
// };
// Submit logic: Differentiate between create and update // Submit logic: Differentiate between create and update
const submit = handleSubmit((values: Player) => { const submit = handleSubmit((values: Player) => {
if (player.value.id) { if (mode.value === 'edit') {
console.log('Updating player:', values); // Replace with update logic console.log('Updating player:', values); // Replace with update logic
} else { // PlayerService.(player.value.id, player.value).then(() => router.push('/players'));
} else if (mode.value === 'create') {
console.log('Creating player:', values); // Replace with create logic console.log('Creating player:', values); // Replace with create logic
PlayerService.save(player.value).then(() => router.push('/home'));
} }
}); });
@ -161,7 +179,11 @@ const [height, heightAttrs] = defineField('height');
<ion-page> <ion-page>
<ion-header> <ion-header>
<ion-toolbar> <ion-toolbar>
<ion-title>{{ isEdit ? 'Update Player' : 'Create Player' }}</ion-title> <ion-title>
<template v-if="mode === 'view'">View Player</template>
<template v-else-if="mode === 'edit'">Edit Player</template>
<template v-else>Create Player</template>
</ion-title>
</ion-toolbar> </ion-toolbar>
</ion-header> </ion-header>