Skip to content

Commit

Permalink
Change the 'Calendar view' to meet the architecture rule & Show 'No D…
Browse files Browse the repository at this point in the history
…ata' for the summary webpage
  • Loading branch information
justin-jiajia committed Jan 16, 2025
1 parent 015fa9f commit 5d92d89
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 50 deletions.
3 changes: 1 addition & 2 deletions mocks/summary_service.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package mocks

import (
"time"

"github.com/muety/wakapi/models"
"github.com/muety/wakapi/models/types"
"github.com/stretchr/testify/mock"
"time"
)

type SummaryServiceMock struct {
Expand Down
23 changes: 21 additions & 2 deletions models/view/summary.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (

conf "github.com/muety/wakapi/config"
"github.com/muety/wakapi/models"
"github.com/muety/wakapi/services"
)

type SummaryViewModel struct {
Expand All @@ -16,12 +15,32 @@ type SummaryViewModel struct {
EditorColors map[string]string
LanguageColors map[string]string
OSColors map[string]string
DailyStats []*services.DailyProjectViewModel
DailyStats []*DailyProjectViewModel
RawQuery string
UserFirstData time.Time
DataRetentionMonths int
}

type DailyProjectViewModel struct {
Date time.Time `json:"date"`
Project string `json:"project"`
Duration time.Duration `json:"duration"`
}

func NewDailyProjectStats(summaries []*models.Summary) []*DailyProjectViewModel {
dailyProjects := make([]*DailyProjectViewModel, 0)
for _, summary := range summaries {
for _, project := range summary.Projects {
dailyProjects = append(dailyProjects, &DailyProjectViewModel{
Date: summary.FromTime.T(),
Project: project.Key,
Duration: project.Total,
})
}
}
return dailyProjects
}

func (s SummaryViewModel) UserDataExpiring() bool {
cfg := conf.Get()
return cfg.Subscriptions.Enabled &&
Expand Down
20 changes: 18 additions & 2 deletions routes/summary.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/muety/wakapi/models/view"
su "github.com/muety/wakapi/routes/utils"
"github.com/muety/wakapi/services"
"github.com/muety/wakapi/utils"
)

type SummaryHandler struct {
Expand Down Expand Up @@ -42,6 +43,19 @@ func (h *SummaryHandler) RegisterRoutes(router chi.Router) {
router.Mount("/summary", r)
}

func (h *SummaryHandler) FetchSummaryForDailyProjectStats(params *models.SummaryParams) ([]*models.Summary, error) {
summaries := make([]*models.Summary, 0)
intervals := utils.SplitRangeByDays(params.From, params.To)
for _, interval := range intervals {
cur_summary, err := h.summarySrvc.Aliased(interval[0], interval[1], params.User, h.summarySrvc.Retrieve, params.Filters, false)
if err != nil {
return nil, err
}
summaries = append(summaries, cur_summary)
}
return summaries, nil
}

func (h *SummaryHandler) GetIndex(w http.ResponseWriter, r *http.Request) {
if h.config.IsDev() {
loadTemplates()
Expand Down Expand Up @@ -87,10 +101,12 @@ func (h *SummaryHandler) GetIndex(w http.ResponseWriter, r *http.Request) {
firstData, _ = time.Parse(time.RFC822Z, firstDataKv.Value)
}

dailyStats, err := h.summarySrvc.NewDailyProjectStats(summary, summaryParams.Filters)
dailyStats := []*view.DailyProjectViewModel{}
dailyStatsSummaries, err := h.FetchSummaryForDailyProjectStats(summaryParams)
if err != nil {
conf.Log().Request(r).Error("failed to load daily stats", "error", err)
dailyStats = []*services.DailyProjectViewModel{}
} else {
dailyStats = view.NewDailyProjectStats(dailyStatsSummaries)
}

vm := view.SummaryViewModel{
Expand Down
4 changes: 1 addition & 3 deletions services/services.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package services

import (
"time"

datastructure "github.com/duke-git/lancet/v2/datastructure/set"
"github.com/muety/wakapi/models"
"github.com/muety/wakapi/models/types"
"github.com/muety/wakapi/utils"
"time"
)

type IAggregationService interface {
Expand Down Expand Up @@ -99,7 +98,6 @@ type ISummaryService interface {
DeleteByUser(string) error
DeleteByUserBefore(string, time.Time) error
Insert(*models.Summary) error
NewDailyProjectStats(*models.Summary, *models.Filters) ([]*DailyProjectViewModel, error)
}

type IActivityService interface {
Expand Down
36 changes: 4 additions & 32 deletions services/summary.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,6 @@ package services

import (
"errors"
"log/slog"
"sort"
"strings"
"time"

"github.com/becheran/wildmatch-go"
"github.com/duke-git/lancet/v2/datetime"
"github.com/duke-git/lancet/v2/slice"
Expand All @@ -15,8 +10,11 @@ import (
"github.com/muety/wakapi/models"
"github.com/muety/wakapi/models/types"
"github.com/muety/wakapi/repositories"
"github.com/muety/wakapi/utils"
"github.com/patrickmn/go-cache"
"log/slog"
"sort"
"strings"
"time"
)

type SummaryService struct {
Expand Down Expand Up @@ -222,32 +220,6 @@ func (srv *SummaryService) Summarize(from, to time.Time, user *models.User, filt
return summary.Sorted(), nil
}

type DailyProjectViewModel struct {
Date time.Time `json:"date"`
Project string `json:"project"`
Duration time.Duration `json:"duration"`
}

// get a day-by-day summary of **each** project
func (srv *SummaryService) NewDailyProjectStats(s *models.Summary, filters *models.Filters) ([]*DailyProjectViewModel, error) {
dailyProjects := make([]*DailyProjectViewModel, 0)
intervals := utils.SplitRangeByDays(s.FromTime.T(), s.ToTime.T())
for _, cur := range intervals {
cur_summary, err := srv.Aliased(cur[0], cur[1].Add(-1*time.Second), s.User, srv.Retrieve, filters, false)
if err != nil {
return nil, err
}
for _, cur_project := range cur_summary.Projects {
dailyProjects = append(dailyProjects, &DailyProjectViewModel{
Date: cur[0],
Project: cur_project.Key,
Duration: cur_project.Total,
})
}
}
return dailyProjects, nil
}

// CRUD methods

func (srv *SummaryService) GetLatestByUser() ([]*models.TimeByUser, error) {
Expand Down
17 changes: 11 additions & 6 deletions static/assets/js/summary.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ const labelsCanvas = document.getElementById('chart-label')
const branchesCanvas = document.getElementById('chart-branches')
const entitiesCanvas = document.getElementById('chart-entities')
const categoriesCanvas = document.getElementById('chart-categories')
const dailyCanvas = document.getElementById('chart-daily-projects')

const projectContainer = document.getElementById('project-container')
const osContainer = document.getElementById('os-container')
Expand All @@ -25,10 +26,11 @@ const labelContainer = document.getElementById('label-container')
const branchContainer = document.getElementById('branch-container')
const entityContainer = document.getElementById('entity-container')
const categoryContainer = document.getElementById('category-container')
const daliyContainer = document.getElementById('daily-container')

const containers = [projectContainer, osContainer, editorContainer, languageContainer, machineContainer, labelContainer, branchContainer, entityContainer, categoryContainer]
const canvases = [projectsCanvas, osCanvas, editorsCanvas, languagesCanvas, machinesCanvas, labelsCanvas, branchesCanvas, entitiesCanvas, categoriesCanvas]
const data = [wakapiData.projects, wakapiData.operatingSystems, wakapiData.editors, wakapiData.languages, wakapiData.machines, wakapiData.labels, wakapiData.branches, wakapiData.entities, wakapiData.categories]
const containers = [projectContainer, osContainer, editorContainer, languageContainer, machineContainer, labelContainer, branchContainer, entityContainer, categoryContainer, daliyContainer]
const canvases = [projectsCanvas, osCanvas, editorsCanvas, languagesCanvas, machinesCanvas, labelsCanvas, branchesCanvas, entitiesCanvas, categoriesCanvas, dailyCanvas]
const data = [wakapiData.projects, wakapiData.operatingSystems, wakapiData.editors, wakapiData.languages, wakapiData.machines, wakapiData.labels, wakapiData.branches, wakapiData.entities, wakapiData.categories, wakapiData.dailyStats]

let topNPickers = [...document.getElementsByClassName('top-picker')]
topNPickers.sort(((a, b) => parseInt(a.attributes['data-entity'].value) - parseInt(b.attributes['data-entity'].value)))
Expand Down Expand Up @@ -504,7 +506,7 @@ function togglePlaceholders(mask) {
}

function getPresentDataMask() {
return data.map(list => (list ? list.reduce((acc, e) => acc + e.total, 0) : 0) > 0)
return data.map(list => (list ? list.reduce((acc, e) => acc + (e.total ? e.total : e.duration), 0) : 0) > 0)
}

function getColor(seed, index) {
Expand Down Expand Up @@ -548,7 +550,10 @@ function extractFile(filePath) {
}

function updateNumTotal() {
for (let i = 0; i < data.length; i++) {
// Why length - 1:
// We don't have a 'topN' for the DailyProjectStats
// So there isn't a input for it.
for (let i = 0; i < data.length - 1; i++) {
document.querySelector(`span[data-entity='${i}']`).innerText = data[i].length.toString()
}
}
Expand Down Expand Up @@ -577,7 +582,7 @@ function drawDailyProjectChart(dailyStats) {
}
})

new Chart(document.getElementById('chart-daily-projects').getContext('2d'), {
new Chart(dailyCanvas.getContext('2d'), {
type: 'bar',
data: {
labels: days.map(d => new Date(d).toLocaleDateString()),
Expand Down
6 changes: 3 additions & 3 deletions views/summary.tpl.html
Original file line number Diff line number Diff line change
Expand Up @@ -291,11 +291,11 @@ <h4 class="font-semibold text-lg text-gray-500">{{ .TotalTime | duration }}</h4>
</div>
</div>

<div class="row-span-1 col-span-1 sm:row-span-3 sm:col-span-3 md:row-span-3 md:col-span-3 p-4 px-6 pb-10 bg-gray-850 text-gray-300 rounded-md shadow flex flex-col w-full no-break {{ if .IsProjectDetails }} hidden {{ end }}"
id="category-container" style="max-height: 224px;">
<div class="row-span-1 col-span-1 sm:row-span-3 sm:col-span-3 md:row-span-3 md:col-span-3 p-4 px-6 pb-10 bg-gray-850 text-gray-300 rounded-md shadow flex flex-col w-full no-break"
id="daily-container" style="max-height: 224px;">
<div class="flex justify-between">
<div class="flex items-center gap-x-2">
<span class="font-semibold text-lg w-1/2 flex-1 whitespace-nowrap">Daily Project Time</span>
<span class="font-semibold text-lg w-1/2 flex-1 whitespace-nowrap">Daily Project Time {{ if .IsProjectDetails }} For this Project {{ end }}</span>
</div>
</div>
<canvas id="chart-daily-projects" class="mt-2"></canvas>
Expand Down

0 comments on commit 5d92d89

Please sign in to comment.