123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <script setup>
  2. import { onMounted } from 'vue'
  3. import { Head } from '@inertiajs/inertia-vue3'
  4. import AppLayout from '@/layouts/AppLayout.vue'
  5. const props = defineProps({
  6. cardStatistics: Object,
  7. chartTransactionStatistics: Object,
  8. chartOutletStatistic: Object,
  9. })
  10. onMounted(() => {
  11. console.log(props.chartTransactionStatistics)
  12. console.log(props.chartOutletStatistic)
  13. })
  14. const transactionBarData = (chartData) => {
  15. const colors = ['#17b6ff', '#ffb51c']
  16. const data = {
  17. datasets: [],
  18. }
  19. let id = 0
  20. for (const key in chartData) {
  21. data.datasets.push({
  22. label: key,
  23. backgroundColor: colors[id],
  24. data: chartData[key],
  25. })
  26. id++
  27. }
  28. return data
  29. }
  30. const transactionBarOption = {
  31. responsive: true,
  32. maintainAspectRatio: false,
  33. datasetFill: false,
  34. scales: {
  35. y: {
  36. ticks: {
  37. beginAtZero: true,
  38. callback: function (label) {
  39. if (Math.floor(label) === label) {
  40. return label
  41. }
  42. },
  43. },
  44. },
  45. },
  46. }
  47. const transactionOutletPieData = (chartData) => {
  48. const labels = []
  49. const data = []
  50. for (const key in chartData) {
  51. labels.push(key)
  52. data.push(chartData[key])
  53. }
  54. return {
  55. labels: labels,
  56. datasets: [
  57. {
  58. data: data,
  59. backgroundColor: ['#17b6ff', '#00c3f7', '#00cbdc', '#00d1b2', '#2bd281', '#86cf50', '#c5c623', '#ffb51c'],
  60. },
  61. ],
  62. }
  63. }
  64. const transactionOutletPieOption = {
  65. maintainAspectRatio: false,
  66. datasetFill: false,
  67. plugins: {
  68. legend: {
  69. labels: {
  70. color: '#495057',
  71. },
  72. },
  73. },
  74. }
  75. </script>
  76. <template>
  77. <AppLayout>
  78. <Head title="Dashboard" />
  79. <div class="grid">
  80. <div v-for="cardStatistic in cardStatistics" class="col-12 md:col-3">
  81. <Card class="h-full">
  82. <template #content>
  83. <div class="flex justify-content-between mb-3">
  84. <div>
  85. <span class="block text-500 font-medium mb-3">{{ cardStatistic.title }}</span>
  86. <div v-if="cardStatistic.value" class="text-900 font-medium text-xl">{{ cardStatistic.value }}</div>
  87. </div>
  88. <div
  89. class="flex align-items-center justify-content-center bg-orange-100 border-round"
  90. style="width: 2.5rem; height: 2.5rem"
  91. >
  92. <i class="text-orange-500 text-xl" :class="cardStatistic.icon"></i>
  93. </div>
  94. </div>
  95. <span class="text-green-500 font-medium">{{ cardStatistic.amount }} </span>
  96. <span class="text-500"> {{ ' ' + cardStatistic.amountLabel }}</span>
  97. </template>
  98. </Card>
  99. </div>
  100. <div v-for="statistic in chartTransactionStatistics" class="col-12 md:col-6">
  101. <Card>
  102. <template #title>
  103. <div class="flex flex-column">
  104. <span>{{ statistic.title }}</span>
  105. <span class="text-base font-normal">{{ statistic.description }}</span>
  106. </div>
  107. </template>
  108. <template #content>
  109. <Chart type="bar" :data="transactionBarData(statistic.data)" :options="transactionBarOption" />
  110. </template>
  111. </Card>
  112. </div>
  113. <div class="col-12 md:col-6">
  114. <Card>
  115. <template #title>
  116. <div class="flex flex-column">
  117. <span>{{ chartOutletStatistic.title }}</span>
  118. <span class="text-base font-normal">{{ chartOutletStatistic.description }}</span>
  119. </div>
  120. </template>
  121. <template #content>
  122. <Chart
  123. type="pie"
  124. :width="600"
  125. :height="300"
  126. :data="transactionOutletPieData(chartOutletStatistic.data)"
  127. :options="transactionOutletPieOption"
  128. />
  129. </template>
  130. </Card>
  131. </div>
  132. </div>
  133. </AppLayout>
  134. </template>