33 <template #header >
44 <div >
55 <p class =" text-xs text-muted uppercase mb-1.5" >
6- Средний чек за {{ data.length }} {{ pluralizationRu(data.length, ['день', 'дня', 'дней'] ) }}
6+ {{ formatTotalLabel('Средний чек', data.length ) }}
77 </p >
88 <p class =" text-3xl text-highlighted font-semibold" >
99 {{ formatNumber(total) }}
3838
3939 <VisCrosshair
4040 color =" var(--ui-info)"
41- :template =" template "
41+ :template =" formatTemplate "
4242 />
4343
4444 <VisTooltip />
4949<script setup lang="ts">
5050import type { Period , Range } from ' #shared/types'
5151import { VisArea , VisAxis , VisCrosshair , VisLine , VisTooltip , VisXYContainer } from ' @unovis/vue'
52- import { eachDayOfInterval , eachMonthOfInterval , eachWeekOfInterval , format } from ' date-fns'
52+ import { addDays , eachDayOfInterval , eachMonthOfInterval , eachWeekOfInterval , format } from ' date-fns'
5353import { ru } from ' date-fns/locale'
5454
5555type DataRecord = {
56- date: Date
56+ start: Date
57+ end: Date
5758 checks: number
5859 averageCheck: number
5960 commonAverageCheck: number
@@ -75,22 +76,72 @@ const data = ref<DataRecord[]>([])
7576watch ([() => period , () => range , () => values , () => metrics ], () => {
7677 const dates = ({
7778 daily: eachDayOfInterval ,
78- weekly: eachWeekOfInterval ,
79+ weekly : () => eachWeekOfInterval ( range , { weekStartsOn: 1 }) ,
7980 monthly: eachMonthOfInterval ,
8081 } as Record <Period , typeof eachDayOfInterval >)[period ](range )
8182
82- data .value = dates .map ((date ) => {
83- const dateStr = format (date , ' yyyy-MM-dd' )
84- const value = values .find ((d ) => d .date .startsWith (dateStr ))
85- const metric = metrics .find ((d ) => d .date .startsWith (dateStr ))
83+ if (period === ' daily' ) {
84+ data .value = dates .map ((date ) => {
85+ const dateStr = format (date , ' yyyy-MM-dd' )
86+ const value = values .find ((d ) => d .date .startsWith (dateStr ))
87+ const metric = metrics .find ((d ) => d .date .startsWith (dateStr ))
88+
89+ return {
90+ start: date ,
91+ end: date ,
92+ checks: value ?.checks ?? 0 ,
93+ averageCheck: value ?.averageCheck ?? 0 ,
94+ commonAverageCheck: metric ?.averageCheck ?? 0 ,
95+ }
96+ })
97+ }
8698
87- return {
88- date ,
89- checks: value ?.checks ?? 0 ,
90- averageCheck: value ?.averageCheck ?? 0 ,
91- commonAverageCheck: metric ?.averageCheck ?? 0 ,
99+ if (period === ' weekly' ) {
100+ const points = []
101+
102+ for (const date of dates ) {
103+ const dateTo = addDays (date , 6 )
104+ const allDates = eachDayOfInterval ({
105+ start: date ,
106+ end: dateTo ,
107+ })
108+
109+ let daysWithValues = 0
110+ let daysWithMetrics = 0
111+
112+ let checks = 0
113+ let averageCheck = 0
114+ let commonAverageCheck = 0
115+
116+ for (const d of allDates ) {
117+ // All in one point
118+ const dateStr = format (d , ' yyyy-MM-dd' )
119+ const value = values .find ((d ) => d .date .startsWith (dateStr ))
120+ const metric = metrics .find ((d ) => d .date .startsWith (dateStr ))
121+
122+ checks += value ?.checks ?? 0
123+
124+ if (value ?.averageCheck ) {
125+ averageCheck += value .averageCheck
126+ daysWithValues ++
127+ }
128+ if (metric ?.averageCheck ) {
129+ commonAverageCheck += metric .averageCheck
130+ daysWithMetrics ++
131+ }
132+ }
133+
134+ points .push ({
135+ start: date ,
136+ end: dateTo ,
137+ checks ,
138+ averageCheck: daysWithValues > 0 ? averageCheck / daysWithValues : 0 ,
139+ commonAverageCheck: daysWithMetrics > 0 ? commonAverageCheck / daysWithMetrics : 0 ,
140+ })
92141 }
93- })
142+
143+ data .value = points
144+ }
94145}, { immediate: true })
95146
96147const x = (_ : DataRecord , i : number ) => i
@@ -119,15 +170,31 @@ function formatDate(date: Date): string {
119170 })[period ]
120171}
121172
173+ function formatTotalLabel(label : string , value : number ): string {
174+ return ({
175+ daily: ` ${label } за ${value } ${pluralizationRu (value , [' день' , ' дня' , ' дней' ])} ` ,
176+ weekly: ` ${label } за ${value } ${pluralizationRu (value , [' неделю' , ' недели' , ' недель' ])} ` ,
177+ monthly: ` ${label } за ${value } ${pluralizationRu (value , [' месяц' , ' месяца' , ' месяцев' ])} ` ,
178+ })[period ]
179+ }
180+
122181function xTicks(i : number ) {
123182 if (i === 0 || i === data .value .length - 1 || ! data .value [i ]) {
124183 return ' '
125184 }
126185
127- return formatDate (data .value [i ].date )
186+ return formatDate (data .value [i ].start )
128187}
129188
130- const template = (d : DataRecord ) => ` <strong>${formatDate (d .date )}, ${format (d .date , ' eeee' , { locale: ru })}</strong><br> ${d .checks } ${pluralizationRu (d .checks , [' чек' , ' чека' , ' чеков' ])}, средний ${formatNumber (d .averageCheck )}<br> Средний по сети: ${formatNumber (d .commonAverageCheck )} `
189+ function formatTemplate(d : DataRecord ) {
190+ const title = ({
191+ daily: ` ${formatDate (d .start )}, ${format (d .start , ' eeee' , { locale: ru })} ` ,
192+ weekly: ` ${formatDate (d .start )} - ${formatDate (d .end )} ` ,
193+ monthly: ` ${formatDate (d .start )} - ${formatDate (d .end )} ` ,
194+ })[period ]
195+
196+ return ` <strong>${title }</strong><br> ${d .checks } ${pluralizationRu (d .checks , [' чек' , ' чека' , ' чеков' ])}, средний ${formatNumber (d .averageCheck )}<br> Средний по сети: ${formatNumber (d .commonAverageCheck )} `
197+ }
131198 </script >
132199
133200<style scoped>
0 commit comments