Compare commits
No commits in common. "4f5f12473d7c1cf544449d9a484be9a26ecd6299" and "58a8ae750a563fbdb5ec1e9737a31a31be046c91" have entirely different histories.
4f5f12473d
...
58a8ae750a
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,2 +0,0 @@
|
|||||||
__pycache__
|
|
||||||
db.sqlite3
|
|
@ -38,6 +38,7 @@ urlpatterns = [
|
|||||||
path("projects/<int:id>/set_parent/", views.set_parent, name="set_parent"),
|
path("projects/<int:id>/set_parent/", views.set_parent, name="set_parent"),
|
||||||
path("projects/<int:id>/", views.project_view, name="project"),
|
path("projects/<int:id>/", views.project_view, name="project"),
|
||||||
path("stats/by-month/<int:year>/<int:month>/", views.get_stats_by_month, name="stats_by_month"),
|
path("stats/by-month/<int:year>/<int:month>/", views.get_stats_by_month, name="stats_by_month"),
|
||||||
|
path("stats/between/<date:start_date>/<date:end_date>/", views.get_stats_between, name="stats_between"),
|
||||||
path("clockings/<date:date>/", views.set_clocking, name="set_clocking"),
|
path("clockings/<date:date>/", views.set_clocking, name="set_clocking"),
|
||||||
path("sagex/<int:id>/<year_month:month>/", views.set_real_sagex, name="set_real_sagex"),
|
path("sagex/<int:id>/<year_month:month>/", views.set_real_sagex, name="set_real_sagex"),
|
||||||
]
|
]
|
||||||
|
@ -34,6 +34,27 @@
|
|||||||
background-color: var(--dark4);
|
background-color: var(--dark4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
.by-range #list {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.by-range #list .row {
|
||||||
|
display: flex;
|
||||||
|
gap: 1.2em;
|
||||||
|
padding: 0.4em 0.8em;
|
||||||
|
background-color: var(--dark3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.by-range #list .no-data {
|
||||||
|
font-style: italic;
|
||||||
|
padding: 0.4em 0.8em;
|
||||||
|
background-color: var(--dark2);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
.by-range .tables {
|
.by-range .tables {
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
let prevMonthBtn, nextMonthBtn, month
|
let prevMonthBtn, nextMonthBtn, month
|
||||||
|
let prevWeekBtn, nextWeekBtn, week
|
||||||
let curYear = new Date().getFullYear()
|
let curYear = new Date().getFullYear()
|
||||||
let curMonth = new Date().getMonth()
|
let curMonth = new Date().getMonth()
|
||||||
let curWeekDate = new Date()
|
let curWeekDate = new Date()
|
||||||
@ -19,6 +20,14 @@ function nextMonth() {
|
|||||||
}
|
}
|
||||||
updateTableMonthly()
|
updateTableMonthly()
|
||||||
}
|
}
|
||||||
|
function prevWeek() {
|
||||||
|
curWeekDate = new Date(curWeekDate.valueOf() - 7 * DAY_MS)
|
||||||
|
updateTableWeekly()
|
||||||
|
}
|
||||||
|
function nextWeek() {
|
||||||
|
curWeekDate = new Date(curWeekDate.valueOf() + 7 * DAY_MS)
|
||||||
|
updateTableWeekly()
|
||||||
|
}
|
||||||
|
|
||||||
function updateTableMonthly() {
|
function updateTableMonthly() {
|
||||||
let year = curYear.toString().padStart(4, "0")
|
let year = curYear.toString().padStart(4, "0")
|
||||||
@ -40,6 +49,29 @@ function updateTableMonthly() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updateTableWeekly() {
|
||||||
|
let weekNum = curWeekDate.getWeek()
|
||||||
|
let weekDay = (curWeekDate.getDay() + 6) % 7
|
||||||
|
let startDate = new Date(curWeekDate.valueOf() - weekDay * DAY_MS)
|
||||||
|
let endDate = new Date(startDate.valueOf() + 6 * DAY_MS)
|
||||||
|
|
||||||
|
let today = new Date()
|
||||||
|
let date = `${MONTHS[startDate.getMonth()]} ${startDate.getDate()}`
|
||||||
|
if (startDate.getFullYear() !== today.getFullYear()) {
|
||||||
|
date += " " + startDate.getFullYear().toString().padStart(4, "0")
|
||||||
|
}
|
||||||
|
document.getElementById("week").innerText = `Week ${weekNum} (${date})`
|
||||||
|
|
||||||
|
fetch(`stats/between/${formatDate(startDate)}/${formatDate(endDate)}/`).then(res => {
|
||||||
|
return res.json()
|
||||||
|
}).then(res => {
|
||||||
|
if (res.status !== "success") {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
updateTable(res.data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
function updateTable(data) {
|
function updateTable(data) {
|
||||||
let totalWorked = data.clockings.map(c => c.total).reduce((a, b) => a + b, 0)
|
let totalWorked = data.clockings.map(c => c.total).reduce((a, b) => a + b, 0)
|
||||||
|
|
||||||
@ -180,8 +212,31 @@ window.addEventListener("load", () => {
|
|||||||
nextMonthBtn = document.getElementById("next-month")
|
nextMonthBtn = document.getElementById("next-month")
|
||||||
month = document.getElementById("month")
|
month = document.getElementById("month")
|
||||||
|
|
||||||
|
prevWeekBtn = document.getElementById("prev-week")
|
||||||
|
nextWeekBtn = document.getElementById("next-week")
|
||||||
|
week = document.getElementById("week")
|
||||||
|
|
||||||
prevMonthBtn.addEventListener("click", () => prevMonth())
|
prevMonthBtn.addEventListener("click", () => prevMonth())
|
||||||
nextMonthBtn.addEventListener("click", () => nextMonth())
|
nextMonthBtn.addEventListener("click", () => nextMonth())
|
||||||
|
prevWeekBtn.addEventListener("click", () => prevWeek())
|
||||||
|
nextWeekBtn.addEventListener("click", () => nextWeek())
|
||||||
|
|
||||||
|
let monthGrp = document.getElementById("month-sel")
|
||||||
|
let weekGrp = document.getElementById("week-sel")
|
||||||
|
|
||||||
|
rangeSel = document.getElementById("range-sel")
|
||||||
|
rangeSel.addEventListener("change", () => {
|
||||||
|
let mode = rangeSel.value
|
||||||
|
if (mode === "weekly") {
|
||||||
|
monthGrp.classList.add("hidden")
|
||||||
|
weekGrp.classList.remove("hidden")
|
||||||
|
updateTableWeekly()
|
||||||
|
} else {
|
||||||
|
monthGrp.classList.remove("hidden")
|
||||||
|
weekGrp.classList.add("hidden")
|
||||||
|
updateTableMonthly()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
updateTableMonthly()
|
updateTableMonthly()
|
||||||
})
|
})
|
@ -20,6 +20,15 @@
|
|||||||
<div id="month">Month</div>
|
<div id="month">Month</div>
|
||||||
<button id="next-month">></button>
|
<button id="next-month">></button>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="week-sel" class="group hidden">
|
||||||
|
<button id="prev-week"><</button>
|
||||||
|
<div id="week">Week</div>
|
||||||
|
<button id="next-week">></button>
|
||||||
|
</div>
|
||||||
|
<select id="range-sel">
|
||||||
|
<option value="monthly">Monthly</option>
|
||||||
|
<option value="weekly">Weekly</option>
|
||||||
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="tables">
|
<div class="tables">
|
||||||
<table id="headers-table">
|
<table id="headers-table">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user