Skip to content

Commit a187660

Browse files
committed
Chart by days for domain
1 parent 384ed73 commit a187660

File tree

4 files changed

+99
-5
lines changed

4 files changed

+99
-5
lines changed

src/components/ByDays.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
<div class="header">{{ t('averageTimeByDays.message') }}</div>
4242
<p>{{ convertSummaryTimeToString(tabsByDays!.averageTime) }}</p>
4343
</div>
44-
<div class="ml-20 mr-20">
44+
<div class="ml-20 mr-20 by-days-chart">
4545
<ByDaysChart :data="tabsByDays!" />
4646
</div>
4747
<div>
@@ -161,4 +161,7 @@ async function exportToCsv() {
161161
justify-content: space-between;
162162
margin: 0 25px;
163163
}
164+
.by-days-chart {
165+
height: 240px;
166+
}
164167
</style>

src/components/ByDaysChart.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ function refreshChart() {
9595

9696
<style scoped>
9797
.chart {
98-
min-height: 230px;
98+
height: 100%;
9999
margin: auto;
100100
margin-top: 10px;
101101
margin-bottom: 10px;

src/components/WebsiteStats.vue

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
</template></VueDatePicker
4646
>
4747
</div>
48-
<div class="mt-20 ml-10 mr-10">
48+
<div class="mt-20 ml-10 mr-10 by-days-chart">
4949
<ByDaysChart :data="tabInfoByDays!" />
5050
</div>
5151
</div>
@@ -68,7 +68,7 @@ import { openPage } from '../utils/open-page';
6868
import { computed, onMounted, ref } from 'vue';
6969
import { SettingsTab } from '../utils/enums';
7070
import { ThisWeekRange, ranges } from '../utils/date';
71-
import { useDomainStatsByDays } from '../compositions/useDomainStatsByDays';
71+
import { useTabStatsByDays } from '../compositions/useTabStatsByDays';
7272
import { TabListByDays } from '../dto/tabListSummary';
7373
import { Tab } from '../entity/tab';
7474
import { getTypeOfUrl } from '../utils/get-type-of-url';
@@ -98,12 +98,16 @@ onMounted(async () => {
9898
const dateTo = selectedDate.value?.[1] as Date;
9999
const repo = await injectTabsRepository();
100100
tab.value = repo.getTab(props.domain);
101+
if (tab == undefined) {
102+
noData.value = true;
103+
return;
104+
}
101105
102106
await loadList(dateFrom, dateTo);
103107
});
104108
105109
async function loadList(dateFrom: Date, dateTo: Date) {
106-
const tabList = await useDomainStatsByDays(dateFrom, dateTo);
110+
const tabList = await useTabStatsByDays(dateFrom, dateTo, tab.value?.url!);
107111
if (tabList != null) {
108112
tabInfoByDays.value = tabList;
109113
if (tabList.days.length == 0 && tabList.summaryTime == 0) noData.value = true;
@@ -130,4 +134,7 @@ async function handleDate(modelData: Date[]) {
130134
display: flex;
131135
justify-content: space-between;
132136
}
137+
.by-days-chart {
138+
height: 400px;
139+
}
133140
</style>
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import { CurrentTabItem } from '../dto/currentTabItem';
2+
import { DayTabs, TabListByDays } from '../dto/tabListSummary';
3+
import { injectTabsRepository } from '../repository/inject-tabs-repository';
4+
import { isSameDay } from 'date-fns';
5+
6+
export async function useTabStatsByDays(
7+
dateFrom: Date,
8+
dateTo: Date,
9+
domain: string,
10+
): Promise<TabListByDays | null> {
11+
const repo = await injectTabsRepository();
12+
const tab = repo.getTab(domain);
13+
let daysTabs: DayTabs[] = [];
14+
15+
if (tab == undefined) return null;
16+
17+
const isTheSameDay = isSameDay(dateFrom, dateTo);
18+
19+
const unSortedTabsByDays = isTheSameDay
20+
? tab.days.filter(s => isSameDay(new Date(s.date), dateFrom))
21+
: tab.days.filter(s => new Date(s.date) >= dateFrom && new Date(s.date) <= dateTo);
22+
23+
if (unSortedTabsByDays.length == 0)
24+
return {
25+
days: [],
26+
averageTime: 0,
27+
summaryTime: 0,
28+
};
29+
30+
unSortedTabsByDays.forEach(tabDay => {
31+
if (
32+
(new Date(tabDay.date) >= dateFrom && new Date(tabDay.date) <= dateTo) ||
33+
(isTheSameDay && isSameDay(new Date(tabDay.date), dateFrom))
34+
) {
35+
let dayTab = daysTabs.find(x => x.day == tabDay.date);
36+
if (dayTab == undefined) {
37+
dayTab = {
38+
day: tabDay.date,
39+
tabs: [],
40+
time: tabDay.summary,
41+
};
42+
dayTab.tabs.push({
43+
favicon: tab.favicon,
44+
url: tab.url,
45+
sessions: tabDay.counter,
46+
summaryTime: tabDay.summary,
47+
});
48+
daysTabs.push(dayTab);
49+
} else {
50+
dayTab.time += tabDay.summary;
51+
dayTab.tabs.push({
52+
favicon: tab.favicon,
53+
url: tab.url,
54+
sessions: tabDay.counter,
55+
summaryTime: tabDay.summary,
56+
});
57+
}
58+
}
59+
});
60+
61+
daysTabs.sort(function (a, b) {
62+
return new Date(a.day).valueOf() - new Date(b.day).valueOf();
63+
});
64+
65+
daysTabs.forEach(dayTab => {
66+
dayTab.tabs.sort(function (a: CurrentTabItem, b: CurrentTabItem) {
67+
return b.summaryTime - a.summaryTime;
68+
});
69+
});
70+
71+
const summaryTime = daysTabs
72+
.map(x => x.time)
73+
.reduce(function (a, b) {
74+
return a + b;
75+
});
76+
77+
const averageTime = Math.round(summaryTime / daysTabs.length);
78+
79+
return {
80+
days: daysTabs,
81+
summaryTime: summaryTime,
82+
averageTime: averageTime,
83+
};
84+
}

0 commit comments

Comments
 (0)