Skip to content

Commit c190df1

Browse files
committed
Chart by days
1 parent 05842e0 commit c190df1

File tree

5 files changed

+195
-4
lines changed

5 files changed

+195
-4
lines changed

src/components/ByDays.vue

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<template>
2+
<div class="no-data" v-if="countOfDays == undefined || countOfDays == 0">No data</div>
3+
<div v-else>
4+
<ByDaysChart :data="tabsByDays" />
5+
<!-- <TabItem v-for="(tab, i) of tabs" :key="i" :item="getItem(tab)" /> -->
6+
</div>
7+
</template>
8+
9+
<script lang="ts">
10+
export default {
11+
name: 'TabList',
12+
};
13+
</script>
14+
15+
<script lang="ts" setup>
16+
import { computed, onMounted, ref } from 'vue';
17+
import ByDaysChart from '../components/ByDaysChart.vue';
18+
import { TabListByDays } from '../dto/tabListSummary';
19+
import { useTabListByDays } from '../compositions/tab-list-by-days';
20+
21+
const tabsByDays = ref<TabListByDays>();
22+
23+
const countOfDays = computed(() =>
24+
tabsByDays.value != undefined ? tabsByDays.value.days.length : 0,
25+
);
26+
27+
async function loadList() {
28+
tabsByDays.value = await useTabListByDays(new Date('06/01/2023'), new Date('06/10/2023'));
29+
}
30+
31+
onMounted(async () => {
32+
await loadList();
33+
});
34+
</script>

src/components/ByDaysChart.vue

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<template>
2+
<div class="chart">
3+
<Bar :data="data" :options="options" />
4+
</div>
5+
</template>
6+
7+
<script lang="ts">
8+
export default {
9+
name: 'BarChart',
10+
};
11+
</script>
12+
13+
<script lang="ts" setup>
14+
import { Bar } from 'vue-chartjs';
15+
import {
16+
Chart as ChartJS,
17+
Title,
18+
Tooltip,
19+
Legend,
20+
BarElement,
21+
CategoryScale,
22+
LinearScale,
23+
} from 'chart.js';
24+
import { convertSummaryTimeToString } from '../utils/converter';
25+
import { TabListByDays } from '../dto/tabListSummary';
26+
27+
const props = defineProps<{
28+
data: TabListByDays;
29+
}>();
30+
31+
ChartJS.register(CategoryScale, LinearScale, BarElement, Title, Tooltip, Legend);
32+
const labelsForChart = props.data.days.map(x => x.day);
33+
const dataForChart = props.data.days.map(x => x.time);
34+
const maxTimeValue = dataForChart.sort((a, b) => b - a)[0];
35+
const tickStep = Math.round(maxTimeValue / 5 / 60) * 60;
36+
37+
const data = {
38+
labels: labelsForChart,
39+
datasets: [
40+
{
41+
backgroundColor: ['#5668e2'],
42+
data: dataForChart,
43+
},
44+
],
45+
};
46+
47+
const options = {
48+
responsive: true,
49+
maintainAspectRatio: false,
50+
plugins: {
51+
legend: {
52+
position: 'none',
53+
},
54+
legendDistance: {
55+
padding: 50,
56+
},
57+
tooltip: {
58+
callbacks: {
59+
label: function (context: any) {
60+
return convertSummaryTimeToString(context.raw);
61+
},
62+
},
63+
},
64+
},
65+
scales: {
66+
y: {
67+
ticks: {
68+
max: maxTimeValue / 60,
69+
stepSize: tickStep,
70+
callback: function (value: any, index: number, ticks: number) {
71+
return convertSummaryTimeToString(value);
72+
},
73+
},
74+
},
75+
},
76+
};
77+
</script>
78+
79+
<style scoped>
80+
.chart {
81+
height: 230px;
82+
margin: auto;
83+
width: 80%;
84+
margin-top: -10px;
85+
margin-bottom: 10px;
86+
}
87+
</style>
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { ActiveDay, DayTabs, TabListByDays } from '../dto/tabListSummary';
2+
import { Tab, TabDay } from '../entity/tab';
3+
import { injectTabsRepository } from '../repository/inject-tabs-repository';
4+
import { SortingBy } from '../utils/enums';
5+
import { daysBetween } from '../utils/time';
6+
import { todayLocalDate } from '../utils/today';
7+
8+
export async function useTabListByDays(dateFrom: Date, dateTo: Date): Promise<TabListByDays> {
9+
const repo = await injectTabsRepository();
10+
const unSortedTabs = repo.getTabs();
11+
let daysTabs: DayTabs[] = [];
12+
13+
const unSortedTabsByDays = unSortedTabs.filter(
14+
x => x.days.find(s => new Date(s.date) >= dateFrom && new Date(s.date) <= dateTo) != undefined,
15+
);
16+
17+
unSortedTabsByDays.forEach(tab => {
18+
tab.days.forEach(day => {
19+
if (new Date(day.date) >= dateFrom && new Date(day.date) <= dateTo) {
20+
let dayTab = daysTabs.find(x => x.day == day.date);
21+
if (dayTab == undefined) {
22+
dayTab = {
23+
day: day.date,
24+
tabs: [],
25+
time: day.summary,
26+
};
27+
dayTab.tabs.push({
28+
favicon: tab.favicon,
29+
url: tab.url,
30+
sessions: day.counter,
31+
summaryTime: day.summary,
32+
summaryTimeForCurrent: day.summary,
33+
});
34+
daysTabs.push(dayTab);
35+
} else {
36+
dayTab.time += day.summary;
37+
dayTab.tabs.push({
38+
favicon: tab.favicon,
39+
url: tab.url,
40+
sessions: day.counter,
41+
summaryTime: day.summary,
42+
summaryTimeForCurrent: day.summary,
43+
});
44+
}
45+
}
46+
});
47+
});
48+
49+
daysTabs = daysTabs.sort(function (a, b) {
50+
return new Date(a.day).valueOf() - new Date(b.day).valueOf();
51+
});
52+
53+
return {
54+
days: daysTabs,
55+
summaryTime: 0,
56+
};
57+
}

src/dto/tabListSummary.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Tab } from '../entity/tab';
2+
import { CurrentTabItem } from './currentTabItem';
23

34
export interface OverallStats extends TabListSummary {
45
firstDay: Date;
@@ -25,3 +26,14 @@ export interface DataForChart {
2526
timeForChart: number[];
2627
sitesForChart: string[];
2728
}
29+
30+
export interface TabListByDays {
31+
days: DayTabs[];
32+
summaryTime: number;
33+
}
34+
35+
export interface DayTabs {
36+
day: string;
37+
tabs: CurrentTabItem[];
38+
time: number;
39+
}

src/pages/Popup.vue

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,18 @@
4040

4141
<div class="slider"><div class="indicator"></div></div>
4242
<div class="content">
43-
<section>
43+
<section id="todayTabList">
4444
<TabList
4545
v-if="activeTab == TypeOfList.Today"
4646
:type="TypeOfList.Today"
4747
:showAllStats="false"
4848
/>
4949
</section>
50-
<section>
50+
<section id="summary">
5151
<TabList v-if="activeTab == TypeOfList.All" :type="TypeOfList.All" :showAllStats="true" />
5252
</section>
53-
<section>
54-
<h2>Shipping</h2>
53+
<section id="byDaysTabList">
54+
<ByDays v-if="activeTab == TypeOfList.ByDays" />
5555
</section>
5656
</div>
5757
</div>
@@ -61,6 +61,7 @@
6161
import { onMounted, ref } from 'vue';
6262
import Browser from 'webextension-polyfill';
6363
import TabList from '../components/TabList.vue';
64+
import ByDays from '../components/ByDays.vue';
6465
import { TypeOfList } from '../utils/enums';
6566
6667
async function openSettings() {

0 commit comments

Comments
 (0)