122 lines
4.2 KiB
Vue
122 lines
4.2 KiB
Vue
<script setup lang="ts">
|
|
import { Head, Link } from '@inertiajs/vue3';
|
|
import { route } from 'ziggy-js';
|
|
import AppLayout from '@/layouts/AppLayout.vue';
|
|
|
|
const props = defineProps<{
|
|
dynamic: {
|
|
id: number;
|
|
name: string;
|
|
};
|
|
participant: {
|
|
id: number;
|
|
name: string;
|
|
display_name: string | null;
|
|
role: string;
|
|
};
|
|
mutations: Array<{
|
|
id: number;
|
|
amount: number;
|
|
description: string;
|
|
status: string;
|
|
created_at: string;
|
|
ledger: { id: number; name: string };
|
|
}>;
|
|
}>();
|
|
|
|
const breadcrumbs = [
|
|
{
|
|
name: 'Dynamics',
|
|
href: route('dynamics.index'),
|
|
},
|
|
{
|
|
name: props.dynamic.name,
|
|
href: route('dynamics.show', props.dynamic.id),
|
|
},
|
|
{
|
|
name: props.participant.display_name ?? props.participant.name,
|
|
href: route('dynamics.users.show', [props.dynamic.id, props.participant.id]),
|
|
},
|
|
];
|
|
</script>
|
|
|
|
<template>
|
|
<Head :title="participant.display_name ?? participant.name" />
|
|
|
|
<AppLayout :breadcrumbs="breadcrumbs">
|
|
<div class="c-participant-show">
|
|
<div class="c-participant-show__container">
|
|
<h2 class="c-participant-show__title">
|
|
Activity for {{ participant.display_name ?? participant.name }} ({{ participant.role.toUpperCase() }}) in {{ dynamic.name }}
|
|
</h2>
|
|
|
|
<div class="c-participant-show__activity-list">
|
|
<div
|
|
v-for="mutation in mutations"
|
|
:key="mutation.id"
|
|
class="c-participant-show__activity-item"
|
|
>
|
|
<Link :href="route('dynamics.ledgers.show', [dynamic.id, mutation.ledger.id])" class="block">
|
|
<div class="c-participant-show__activity-meta">
|
|
<span class="c-participant-show__activity-time">
|
|
{{ new Date(mutation.created_at).toLocaleString() }}
|
|
</span>
|
|
<span class="font-semibold ml-2" :class="mutation.amount > 0 ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400'">
|
|
{{ mutation.amount > 0 ? '+' : '' }}{{ mutation.amount }}
|
|
</span>
|
|
<span class="text-neutral-400 ml-2">on {{ mutation.ledger.name }}</span>
|
|
<span class="uppercase text-xs px-1.5 py-0.5 rounded ml-auto" :class="mutation.status === 'approved' ? 'bg-green-100 text-green-700 dark:bg-green-950/30 dark:text-green-400' : 'bg-yellow-100 text-yellow-700 dark:bg-yellow-950/30 dark:text-yellow-400'">
|
|
{{ mutation.status }}
|
|
</span>
|
|
</div>
|
|
<p class="c-participant-show__activity-desc">
|
|
{{ mutation.description }}
|
|
</p>
|
|
</Link>
|
|
</div>
|
|
<div v-if="mutations.length === 0" class="text-neutral-500 text-sm">
|
|
No mutations recorded for this participant in this Dynamic yet.
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</AppLayout>
|
|
</template>
|
|
|
|
<style scoped>
|
|
@reference "../../../../css/app.css";
|
|
|
|
.c-participant-show {
|
|
@apply py-12;
|
|
}
|
|
|
|
.c-participant-show__container {
|
|
@apply mx-auto max-w-7xl sm:px-6 lg:px-8;
|
|
}
|
|
|
|
.c-participant-show__title {
|
|
@apply mb-6 text-xl font-bold tracking-tight text-neutral-900 dark:text-neutral-100;
|
|
}
|
|
|
|
.c-participant-show__activity-list {
|
|
@apply space-y-4;
|
|
}
|
|
|
|
.c-participant-show__activity-item {
|
|
@apply rounded-lg border p-4 transition-colors hover:bg-neutral-50 dark:border-neutral-800 dark:hover:bg-neutral-900;
|
|
background-color: var(--card);
|
|
}
|
|
|
|
.c-participant-show__activity-meta {
|
|
@apply mb-1.5 flex items-center text-xs;
|
|
}
|
|
|
|
.c-participant-show__activity-time {
|
|
@apply text-neutral-400 dark:text-neutral-500;
|
|
}
|
|
|
|
.c-participant-show__activity-desc {
|
|
@apply text-sm text-neutral-600 dark:text-neutral-400 mt-1;
|
|
}
|
|
</style>
|