61 lines
1.3 KiB
Vue
61 lines
1.3 KiB
Vue
<template>
|
|
<div>
|
|
<div class="flex flex-row justify-between pb-3">
|
|
<h1 class="text-2xl font-bold">{{ title }}</h1>
|
|
<!-- generic report filters -->
|
|
<div class="flex gap-2 px-2">
|
|
<div v-for="filter in filters" :key="filter.name">
|
|
<p class="text-sm text-gray-600">{{ filter.label }}</p>
|
|
<FormControl
|
|
:type="filter.type"
|
|
:options="filter.options"
|
|
v-model="filter.value"
|
|
/>
|
|
</div>
|
|
<slot name="actions"> </slot>
|
|
</div>
|
|
</div>
|
|
<div class="divide-y">
|
|
<div class="flex items-center gap-2 py-2 text-base text-gray-600">
|
|
<!-- generic report columns -->
|
|
<div v-for="column in columns" :key="column.name" :class="column.class">
|
|
{{ column.label }}
|
|
</div>
|
|
</div>
|
|
<div
|
|
class="flex items-center gap-2 py-2 text-base"
|
|
v-for="(row, i) in data"
|
|
:key="i"
|
|
>
|
|
<!-- loop through data -->
|
|
<div v-for="column in row" :key="column.name" :class="column['class']">
|
|
{{ column['value'] }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
export default {
|
|
name: 'Report',
|
|
props: {
|
|
filters: {
|
|
type: Array,
|
|
default: () => []
|
|
},
|
|
columns: {
|
|
type: Array,
|
|
required: true
|
|
},
|
|
data: {
|
|
type: Array,
|
|
default: () => []
|
|
},
|
|
title: {
|
|
type: String,
|
|
required: true
|
|
}
|
|
}
|
|
};
|
|
</script>
|