Compare commits
No commits in common. "2dfcfaf48dc56d026ad01ad752804d19be76c403" and "f2198994d506776e42f354846c39b5072d5908b3" have entirely different histories.
2dfcfaf48d
...
f2198994d5
18 changed files with 388 additions and 67 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -22,4 +22,3 @@ pnpm-debug.log*
|
|||
|
||||
# jetbrains setting folder
|
||||
.idea/
|
||||
.playwright-mcp/
|
||||
|
|
|
|||
1
.playwright-mcp/console-2026-06-14T14-30-38-925Z.log
Normal file
1
.playwright-mcp/console-2026-06-14T14-30-38-925Z.log
Normal file
|
|
@ -0,0 +1 @@
|
|||
[ 2280ms] [ERROR] JSHandle@object @ http://localhost:4322/:305
|
||||
1
.playwright-mcp/console-2026-06-14T14-33-38-275Z.log
Normal file
1
.playwright-mcp/console-2026-06-14T14-33-38-275Z.log
Normal file
|
|
@ -0,0 +1 @@
|
|||
[ 2268ms] [ERROR] JSHandle@object @ http://localhost:4322/:305
|
||||
0
.playwright-mcp/page-2026-06-14T14-30-39-017Z.yml
Normal file
0
.playwright-mcp/page-2026-06-14T14-30-39-017Z.yml
Normal file
0
.playwright-mcp/page-2026-06-14T14-31-46-468Z.yml
Normal file
0
.playwright-mcp/page-2026-06-14T14-31-46-468Z.yml
Normal file
BIN
.playwright-mcp/page-2026-06-14T14-31-56-474Z.png
Normal file
BIN
.playwright-mcp/page-2026-06-14T14-31-56-474Z.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.1 KiB |
1
.playwright-mcp/page-2026-06-14T14-33-38-341Z.yml
Normal file
1
.playwright-mcp/page-2026-06-14T14-33-38-341Z.yml
Normal file
|
|
@ -0,0 +1 @@
|
|||
- paragraph [ref=e5]: Loading time tracking data...
|
||||
3
.playwright-mcp/page-2026-06-14T14-33-45-118Z.yml
Normal file
3
.playwright-mcp/page-2026-06-14T14-33-45-118Z.yml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
- generic [ref=e6]:
|
||||
- heading "Error Loading Data" [level=2] [ref=e7]
|
||||
- paragraph [ref=e8]: ApexCharts is not defined
|
||||
BIN
.playwright-mcp/page-2026-06-14T14-33-48-605Z.png
Normal file
BIN
.playwright-mcp/page-2026-06-14T14-33-48-605Z.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
3
.playwright-mcp/page-2026-06-14T14-46-48-666Z.yml
Normal file
3
.playwright-mcp/page-2026-06-14T14-46-48-666Z.yml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
- generic [active] [ref=e1]:
|
||||
- paragraph [ref=e5]: Loading time tracking data...
|
||||
- img
|
||||
187
.playwright-mcp/page-2026-06-14T14-46-55-990Z.yml
Normal file
187
.playwright-mcp/page-2026-06-14T14-46-55-990Z.yml
Normal file
|
|
@ -0,0 +1,187 @@
|
|||
- generic [active] [ref=e1]:
|
||||
- generic [ref=e6]:
|
||||
- heading "Time Tracking Dashboard" [level=1] [ref=e7]
|
||||
- generic [ref=e8]:
|
||||
- generic [ref=e9]:
|
||||
- generic [ref=e10]: 0m
|
||||
- generic [ref=e11]: Time Worked Today
|
||||
- generic [ref=e12]:
|
||||
- generic [ref=e13]: 6h 51m
|
||||
- generic [ref=e14]: Time Worked This Week
|
||||
- generic [ref=e15]:
|
||||
- generic [ref=e16]: 6h 51m
|
||||
- generic [ref=e17]: Total Time Tracked
|
||||
- generic [ref=e18]:
|
||||
- generic [ref=e19]: "6"
|
||||
- generic [ref=e20]: Tracked Items
|
||||
- generic [ref=e21]:
|
||||
- generic [ref=e22]:
|
||||
- heading "Time Worked - Last 2 Weeks" [level=2] [ref=e23]
|
||||
- generic [ref=e25]:
|
||||
- img [ref=e26]:
|
||||
- generic [ref=e29]:
|
||||
- generic "4.5" [ref=e30]
|
||||
- generic "4.0" [ref=e31]
|
||||
- generic "3.5" [ref=e32]
|
||||
- generic "3.0" [ref=e33]
|
||||
- generic "2.5" [ref=e34]
|
||||
- generic "2.0" [ref=e35]
|
||||
- generic "1.5" [ref=e36]
|
||||
- generic "1.0" [ref=e37]
|
||||
- generic "0.5" [ref=e38]
|
||||
- generic "0" [ref=e39]
|
||||
- generic [ref=e64]:
|
||||
- generic "06/02" [ref=e65]
|
||||
- generic "06/03" [ref=e66]
|
||||
- generic "06/04" [ref=e67]
|
||||
- generic "06/05" [ref=e68]
|
||||
- generic "06/06" [ref=e69]
|
||||
- generic "06/07" [ref=e70]
|
||||
- generic "06/08" [ref=e71]
|
||||
- generic "06/09" [ref=e72]
|
||||
- generic "06/10" [ref=e73]
|
||||
- generic "06/11" [ref=e74]
|
||||
- generic "06/12" [ref=e75]
|
||||
- generic "06/13" [ref=e76]
|
||||
- generic "06/14" [ref=e77]
|
||||
- generic [ref=e78]:
|
||||
- generic "Zoom In" [ref=e79] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Zoom Out" [ref=e80] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Selection Zoom" [ref=e81] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Panning" [ref=e82] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Reset Zoom" [ref=e83] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Menu" [ref=e84] [cursor=pointer]:
|
||||
- img
|
||||
- generic:
|
||||
- generic "Download SVG"
|
||||
- generic "Download PNG"
|
||||
- generic "Download CSV"
|
||||
- generic [ref=e85]:
|
||||
- heading "Time Worked - Last Month" [level=2] [ref=e86]
|
||||
- generic [ref=e88]:
|
||||
- img [ref=e89]:
|
||||
- generic [ref=e92]:
|
||||
- generic "4.5" [ref=e93]
|
||||
- generic "4.0" [ref=e94]
|
||||
- generic "3.5" [ref=e95]
|
||||
- generic "3.0" [ref=e96]
|
||||
- generic "2.5" [ref=e97]
|
||||
- generic "2.0" [ref=e98]
|
||||
- generic "1.5" [ref=e99]
|
||||
- generic "1.0" [ref=e100]
|
||||
- generic "0.5" [ref=e101]
|
||||
- generic "0" [ref=e102]
|
||||
- generic [ref=e143]:
|
||||
- generic "05/17" [ref=e144]
|
||||
- generic "05/19" [ref=e145]
|
||||
- generic "05/21" [ref=e146]
|
||||
- generic "05/23" [ref=e147]
|
||||
- generic "05/25" [ref=e148]
|
||||
- generic "05/27" [ref=e149]
|
||||
- generic "05/29" [ref=e150]
|
||||
- generic "05/31" [ref=e151]
|
||||
- generic "06/02" [ref=e152]
|
||||
- generic "06/04" [ref=e153]
|
||||
- generic "06/06" [ref=e154]
|
||||
- generic "06/08" [ref=e155]
|
||||
- generic "06/10" [ref=e156]
|
||||
- generic "06/12" [ref=e157]
|
||||
- generic "06/14" [ref=e158]
|
||||
- generic [ref=e159]:
|
||||
- generic "Zoom In" [ref=e160] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Zoom Out" [ref=e161] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Selection Zoom" [ref=e162] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Panning" [ref=e163] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Reset Zoom" [ref=e164] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Menu" [ref=e165] [cursor=pointer]:
|
||||
- img
|
||||
- generic:
|
||||
- generic "Download SVG"
|
||||
- generic "Download PNG"
|
||||
- generic "Download CSV"
|
||||
- generic [ref=e166]:
|
||||
- generic [ref=e167]:
|
||||
- heading "Time by Issue" [level=2] [ref=e168]
|
||||
- generic [ref=e170]:
|
||||
- img [ref=e171]:
|
||||
- generic [ref=e173]:
|
||||
- generic [ref=e191]:
|
||||
- generic:
|
||||
- generic: 0.1h
|
||||
- generic: 0.0h
|
||||
- generic: 4.2h
|
||||
- generic: 1.3h
|
||||
- generic [ref=e198]:
|
||||
- generic "#11 - Inspect" [ref=e199]
|
||||
- generic "#..." [ref=e200]
|
||||
- generic "#3..." [ref=e201]
|
||||
- generic "#41..." [ref=e202]
|
||||
- generic [ref=e204]:
|
||||
- generic "5" [ref=e205]
|
||||
- generic "4" [ref=e206]
|
||||
- generic "4" [ref=e207]
|
||||
- generic "3" [ref=e208]
|
||||
- generic "3" [ref=e209]
|
||||
- generic "2" [ref=e210]
|
||||
- generic "2" [ref=e211]
|
||||
- generic "1" [ref=e212]
|
||||
- generic "1" [ref=e213]
|
||||
- generic "0" [ref=e214]
|
||||
- generic [ref=e215]:
|
||||
- generic "Menu" [ref=e216] [cursor=pointer]:
|
||||
- img
|
||||
- generic:
|
||||
- generic "Download SVG"
|
||||
- generic "Download PNG"
|
||||
- generic "Download CSV"
|
||||
- generic [ref=e217]:
|
||||
- heading "Time by Pull Request" [level=2] [ref=e218]
|
||||
- generic [ref=e220]:
|
||||
- img [ref=e221]:
|
||||
- generic [ref=e223]:
|
||||
- generic [ref=e242]:
|
||||
- generic:
|
||||
- generic: 0.4h
|
||||
- generic: 0.9h
|
||||
- generic [ref=e247]:
|
||||
- 'generic "#45 - PR für #34" [ref=e248]'
|
||||
- generic "#..." [ref=e249]
|
||||
- generic [ref=e251]:
|
||||
- generic "1.0" [ref=e252]
|
||||
- generic "0.9" [ref=e253]
|
||||
- generic "0.8" [ref=e254]
|
||||
- generic "0.7" [ref=e255]
|
||||
- generic "0.6" [ref=e256]
|
||||
- generic "0.5" [ref=e257]
|
||||
- generic "0.4" [ref=e258]
|
||||
- generic "0.3" [ref=e259]
|
||||
- generic "0.2" [ref=e260]
|
||||
- generic "0.1" [ref=e261]
|
||||
- generic "0.0" [ref=e262]
|
||||
- generic [ref=e263]:
|
||||
- generic "Menu" [ref=e264] [cursor=pointer]:
|
||||
- img
|
||||
- generic:
|
||||
- generic "Download SVG"
|
||||
- generic "Download PNG"
|
||||
- generic "Download CSV"
|
||||
- generic [ref=e265]:
|
||||
- heading "Time Distribution - Issues vs Pull Requests" [level=2] [ref=e266]
|
||||
- img [ref=e269]:
|
||||
- generic [ref=e271]:
|
||||
- generic [ref=e274] [cursor=pointer]: Issues
|
||||
- generic [ref=e277] [cursor=pointer]: Pull Requests
|
||||
- generic [ref=e282]:
|
||||
- generic: 81.2h
|
||||
- generic: 18.8h
|
||||
- img
|
||||
BIN
.playwright-mcp/page-2026-06-14T14-47-00-181Z.png
Normal file
BIN
.playwright-mcp/page-2026-06-14T14-47-00-181Z.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 78 KiB |
BIN
.playwright-mcp/page-2026-06-14T14-48-32-956Z.png
Normal file
BIN
.playwright-mcp/page-2026-06-14T14-48-32-956Z.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
BIN
.playwright-mcp/page-2026-06-14T14-48-41-291Z.png
Normal file
BIN
.playwright-mcp/page-2026-06-14T14-48-41-291Z.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 137 KiB |
3
.playwright-mcp/page-2026-06-14T15-03-10-783Z.yml
Normal file
3
.playwright-mcp/page-2026-06-14T15-03-10-783Z.yml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
- generic [active] [ref=e1]:
|
||||
- paragraph [ref=e5]: Loading time tracking data...
|
||||
- img
|
||||
187
.playwright-mcp/page-2026-06-14T15-03-19-174Z.yml
Normal file
187
.playwright-mcp/page-2026-06-14T15-03-19-174Z.yml
Normal file
|
|
@ -0,0 +1,187 @@
|
|||
- generic [active] [ref=e1]:
|
||||
- generic [ref=e6]:
|
||||
- heading "Time Tracking Dashboard" [level=1] [ref=e7]
|
||||
- generic [ref=e8]:
|
||||
- generic [ref=e9]:
|
||||
- generic [ref=e10]: 0m
|
||||
- generic [ref=e11]: Time Worked Today
|
||||
- generic [ref=e12]:
|
||||
- generic [ref=e13]: 6h 51m
|
||||
- generic [ref=e14]: Time Worked This Week
|
||||
- generic [ref=e15]:
|
||||
- generic [ref=e16]: 6h 51m
|
||||
- generic [ref=e17]: Time Worked This Month
|
||||
- generic [ref=e18]:
|
||||
- generic [ref=e19]: "6"
|
||||
- generic [ref=e20]: Tracked Items
|
||||
- generic [ref=e21]:
|
||||
- generic [ref=e22]:
|
||||
- heading "Time Worked - Last 2 Weeks" [level=2] [ref=e23]
|
||||
- generic [ref=e25]:
|
||||
- img [ref=e26]:
|
||||
- generic [ref=e29]:
|
||||
- generic "4.5" [ref=e30]
|
||||
- generic "4.0" [ref=e31]
|
||||
- generic "3.5" [ref=e32]
|
||||
- generic "3.0" [ref=e33]
|
||||
- generic "2.5" [ref=e34]
|
||||
- generic "2.0" [ref=e35]
|
||||
- generic "1.5" [ref=e36]
|
||||
- generic "1.0" [ref=e37]
|
||||
- generic "0.5" [ref=e38]
|
||||
- generic "0" [ref=e39]
|
||||
- generic [ref=e64]:
|
||||
- generic "06/02" [ref=e65]
|
||||
- generic "06/03" [ref=e66]
|
||||
- generic "06/04" [ref=e67]
|
||||
- generic "06/05" [ref=e68]
|
||||
- generic "06/06" [ref=e69]
|
||||
- generic "06/07" [ref=e70]
|
||||
- generic "06/08" [ref=e71]
|
||||
- generic "06/09" [ref=e72]
|
||||
- generic "06/10" [ref=e73]
|
||||
- generic "06/11" [ref=e74]
|
||||
- generic "06/12" [ref=e75]
|
||||
- generic "06/13" [ref=e76]
|
||||
- generic "06/14" [ref=e77]
|
||||
- generic [ref=e78]:
|
||||
- generic "Zoom In" [ref=e79] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Zoom Out" [ref=e80] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Selection Zoom" [ref=e81] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Panning" [ref=e82] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Reset Zoom" [ref=e83] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Menu" [ref=e84] [cursor=pointer]:
|
||||
- img
|
||||
- generic:
|
||||
- generic "Download SVG"
|
||||
- generic "Download PNG"
|
||||
- generic "Download CSV"
|
||||
- generic [ref=e85]:
|
||||
- heading "Time Worked - Last Month" [level=2] [ref=e86]
|
||||
- generic [ref=e88]:
|
||||
- img [ref=e89]:
|
||||
- generic [ref=e92]:
|
||||
- generic "4.5" [ref=e93]
|
||||
- generic "4.0" [ref=e94]
|
||||
- generic "3.5" [ref=e95]
|
||||
- generic "3.0" [ref=e96]
|
||||
- generic "2.5" [ref=e97]
|
||||
- generic "2.0" [ref=e98]
|
||||
- generic "1.5" [ref=e99]
|
||||
- generic "1.0" [ref=e100]
|
||||
- generic "0.5" [ref=e101]
|
||||
- generic "0" [ref=e102]
|
||||
- generic [ref=e143]:
|
||||
- generic "05/17" [ref=e144]
|
||||
- generic "05/19" [ref=e145]
|
||||
- generic "05/21" [ref=e146]
|
||||
- generic "05/23" [ref=e147]
|
||||
- generic "05/25" [ref=e148]
|
||||
- generic "05/27" [ref=e149]
|
||||
- generic "05/29" [ref=e150]
|
||||
- generic "05/31" [ref=e151]
|
||||
- generic "06/02" [ref=e152]
|
||||
- generic "06/04" [ref=e153]
|
||||
- generic "06/06" [ref=e154]
|
||||
- generic "06/08" [ref=e155]
|
||||
- generic "06/10" [ref=e156]
|
||||
- generic "06/12" [ref=e157]
|
||||
- generic "06/14" [ref=e158]
|
||||
- generic [ref=e159]:
|
||||
- generic "Zoom In" [ref=e160] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Zoom Out" [ref=e161] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Selection Zoom" [ref=e162] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Panning" [ref=e163] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Reset Zoom" [ref=e164] [cursor=pointer]:
|
||||
- img
|
||||
- generic "Menu" [ref=e165] [cursor=pointer]:
|
||||
- img
|
||||
- generic:
|
||||
- generic "Download SVG"
|
||||
- generic "Download PNG"
|
||||
- generic "Download CSV"
|
||||
- generic [ref=e166]:
|
||||
- generic [ref=e167]:
|
||||
- heading "Time by Issue" [level=2] [ref=e168]
|
||||
- generic [ref=e170]:
|
||||
- img [ref=e171]:
|
||||
- generic [ref=e173]:
|
||||
- generic [ref=e191]:
|
||||
- generic:
|
||||
- generic: 0.1h
|
||||
- generic: 0.0h
|
||||
- generic: 4.2h
|
||||
- generic: 1.3h
|
||||
- generic [ref=e198]:
|
||||
- generic "#11 - Inspect" [ref=e199]
|
||||
- generic "#..." [ref=e200]
|
||||
- generic "#3..." [ref=e201]
|
||||
- generic "#41..." [ref=e202]
|
||||
- generic [ref=e204]:
|
||||
- generic "5" [ref=e205]
|
||||
- generic "4" [ref=e206]
|
||||
- generic "4" [ref=e207]
|
||||
- generic "3" [ref=e208]
|
||||
- generic "3" [ref=e209]
|
||||
- generic "2" [ref=e210]
|
||||
- generic "2" [ref=e211]
|
||||
- generic "1" [ref=e212]
|
||||
- generic "1" [ref=e213]
|
||||
- generic "0" [ref=e214]
|
||||
- generic [ref=e215]:
|
||||
- generic "Menu" [ref=e216] [cursor=pointer]:
|
||||
- img
|
||||
- generic:
|
||||
- generic "Download SVG"
|
||||
- generic "Download PNG"
|
||||
- generic "Download CSV"
|
||||
- generic [ref=e217]:
|
||||
- heading "Time by Pull Request" [level=2] [ref=e218]
|
||||
- generic [ref=e220]:
|
||||
- img [ref=e221]:
|
||||
- generic [ref=e223]:
|
||||
- generic [ref=e242]:
|
||||
- generic:
|
||||
- generic: 0.4h
|
||||
- generic: 0.9h
|
||||
- generic [ref=e247]:
|
||||
- 'generic "#45 - PR für #34" [ref=e248]'
|
||||
- generic "#..." [ref=e249]
|
||||
- generic [ref=e251]:
|
||||
- generic "1.0" [ref=e252]
|
||||
- generic "0.9" [ref=e253]
|
||||
- generic "0.8" [ref=e254]
|
||||
- generic "0.7" [ref=e255]
|
||||
- generic "0.6" [ref=e256]
|
||||
- generic "0.5" [ref=e257]
|
||||
- generic "0.4" [ref=e258]
|
||||
- generic "0.3" [ref=e259]
|
||||
- generic "0.2" [ref=e260]
|
||||
- generic "0.1" [ref=e261]
|
||||
- generic "0.0" [ref=e262]
|
||||
- generic [ref=e263]:
|
||||
- generic "Menu" [ref=e264] [cursor=pointer]:
|
||||
- img
|
||||
- generic:
|
||||
- generic "Download SVG"
|
||||
- generic "Download PNG"
|
||||
- generic "Download CSV"
|
||||
- generic [ref=e265]:
|
||||
- heading "Time Distribution - Issues vs Pull Requests" [level=2] [ref=e266]
|
||||
- img [ref=e269]:
|
||||
- generic [ref=e271]:
|
||||
- generic [ref=e274] [cursor=pointer]: Issues
|
||||
- generic [ref=e277] [cursor=pointer]: Pull Requests
|
||||
- generic [ref=e282]:
|
||||
- generic: 81.2h
|
||||
- generic: 18.8h
|
||||
- img
|
||||
BIN
.playwright-mcp/page-2026-06-14T15-03-23-572Z.png
Normal file
BIN
.playwright-mcp/page-2026-06-14T15-03-23-572Z.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 78 KiB |
|
|
@ -13,7 +13,7 @@ const REPO_FILTER = import.meta.env.PUBLIC_REPO_FILTER || '';
|
|||
<meta name="generator" content={Astro.generator} />
|
||||
<title>Time Tracking Dashboard</title>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/apexcharts@3.49.2/dist/apexcharts.css" />
|
||||
<style is:global>
|
||||
<style>
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
html, body {
|
||||
margin: 0; width: 100%; height: 100%;
|
||||
|
|
@ -27,24 +27,12 @@ const REPO_FILTER = import.meta.env.PUBLIC_REPO_FILTER || '';
|
|||
.stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; margin-bottom: 32px; }
|
||||
.stat-card { background: rgba(139, 92, 246, 0.1); border: 1px solid rgba(139, 92, 246, 0.2); border-radius: 12px; padding: 20px; text-align: center; backdrop-filter: blur(10px); }
|
||||
.stat-value { font-size: 32px; font-weight: 700; color: #c4a7ff; margin-bottom: 4px; }
|
||||
.stat-value.positive { color: #22c55e; }
|
||||
.stat-value.negative { color: #ff6b6b; }
|
||||
.stat-label { font-size: 13px; color: #a0a0b8; text-transform: uppercase; letter-spacing: 0.5px; }
|
||||
.charts-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(500px, 1fr)); gap: 16px; margin-bottom: 16px; }
|
||||
.chart-card { background: rgba(139, 92, 246, 0.08); border: 1px solid rgba(139, 92, 246, 0.15); border-radius: 12px; padding: 20px; backdrop-filter: blur(10px); }
|
||||
.chart-card.full-width { grid-column: 1 / -1; }
|
||||
.chart-title { font-size: 16px; font-weight: 500; color: #c4a7ff; margin-bottom: 16px; }
|
||||
.chart { width: 100%; min-height: 350px; }
|
||||
.table-card { background: rgba(139, 92, 246, 0.08); border: 1px solid rgba(139, 92, 246, 0.15); border-radius: 12px; padding: 20px; backdrop-filter: blur(10px); margin-top: 32px; margin-bottom: 16px; }
|
||||
.monthly-table { width: 100%; border-collapse: collapse; }
|
||||
.monthly-table th { text-align: left; padding: 10px 12px; border-bottom: 1px solid rgba(139, 92, 246, 0.2); color: #c4a7ff; font-size: 13px; text-transform: uppercase; letter-spacing: 0.5px; }
|
||||
.monthly-table th:nth-child(2), .monthly-table th:nth-child(3) { text-align: right; }
|
||||
.monthly-table td { padding: 10px 12px; border-bottom: 1px solid rgba(139, 92, 246, 0.08); font-size: 14px; }
|
||||
.monthly-table td:nth-child(1) { font-weight: 700; }
|
||||
.monthly-table td:nth-child(2), .monthly-table td:nth-child(3) { text-align: right; font-weight: 700; font-size: 16px; }
|
||||
.monthly-table td.diff-positive { color: #22c55e; }
|
||||
.monthly-table td.diff-negative { color: #ff6b6b; }
|
||||
.monthly-table tr:last-child td { border-bottom: none; }
|
||||
.loading { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 60vh; }
|
||||
.spinner { width: 48px; height: 48px; border: 4px solid rgba(139, 92, 246, 0.2); border-top-color: #c4a7ff; border-radius: 50%; animation: spin 0.8s linear infinite; margin-bottom: 16px; }
|
||||
@keyframes spin { to { transform: rotate(360deg); } }
|
||||
|
|
@ -79,10 +67,6 @@ const REPO_FILTER = import.meta.env.PUBLIC_REPO_FILTER || '';
|
|||
<div class="stat-value" id="tracked-items">-</div>
|
||||
<div class="stat-label">Tracked Items</div>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<div class="stat-value" id="time-12month-balance">-</div>
|
||||
<div class="stat-label">12-Month Balance (target 36.5h/mo)</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="charts-grid">
|
||||
|
|
@ -111,20 +95,6 @@ const REPO_FILTER = import.meta.env.PUBLIC_REPO_FILTER || '';
|
|||
<h2 class="chart-title">Time Distribution - Issues vs Pull Requests</h2>
|
||||
<div id="chart-distribution" class="chart"></div>
|
||||
</div>
|
||||
|
||||
<div class="table-card">
|
||||
<h2 class="chart-title">Monthly Summary - Last 12 Months (target 36.5h)</h2>
|
||||
<table class="monthly-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Month</th>
|
||||
<th>Hours Worked</th>
|
||||
<th>Difference</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="monthly-table-body"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div id="error" class="error" style="display: none;">
|
||||
<h2>Error Loading Data</h2>
|
||||
|
|
@ -182,9 +152,7 @@ const REPO_FILTER = import.meta.env.PUBLIC_REPO_FILTER || '';
|
|||
|
||||
function getSinceDate() {
|
||||
var now = new Date();
|
||||
var d = new Date(Date.UTC(now.getFullYear(), now.getMonth(), 1));
|
||||
d.setUTCFullYear(d.getUTCFullYear() - 1);
|
||||
return d.toISOString();
|
||||
return new Date(Date.UTC(now.getFullYear(), now.getMonth(), 1)).toISOString();
|
||||
}
|
||||
|
||||
function utcDayKey(d) {
|
||||
|
|
@ -227,7 +195,6 @@ const REPO_FILTER = import.meta.env.PUBLIC_REPO_FILTER || '';
|
|||
var monthStart = getMonthStart();
|
||||
|
||||
var dayMap = {};
|
||||
var monthMap = {};
|
||||
var issuesData = {};
|
||||
var prsData = {};
|
||||
var issuesTotal = 0;
|
||||
|
|
@ -249,11 +216,6 @@ const REPO_FILTER = import.meta.env.PUBLIC_REPO_FILTER || '';
|
|||
if (!dayMap[dayKey]) dayMap[dayKey] = 0;
|
||||
dayMap[dayKey] += timeSec;
|
||||
|
||||
var createdDate = new Date(entry.created);
|
||||
var monthKey = createdDate.getUTCFullYear() + '-' + String(createdDate.getUTCMonth() + 1).padStart(2, '0');
|
||||
if (!monthMap[monthKey]) monthMap[monthKey] = 0;
|
||||
monthMap[monthKey] += timeSec;
|
||||
|
||||
if (entry.issue) {
|
||||
var itemId = entry.issue.pull_request ? 'pr_' + entry.issue.id : 'issue_' + entry.issue.id;
|
||||
trackedItems.add(itemId);
|
||||
|
|
@ -367,32 +329,6 @@ const REPO_FILTER = import.meta.env.PUBLIC_REPO_FILTER || '';
|
|||
legend: { show: false }
|
||||
}).render();
|
||||
|
||||
// 12-month balance
|
||||
var targetHours = 36.5;
|
||||
var totalBalance = 0;
|
||||
var monthRows = '';
|
||||
var now_ = new Date();
|
||||
var monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
||||
for (var m = 11; m >= 0; m--) {
|
||||
var y = now_.getUTCFullYear();
|
||||
var mo = now_.getUTCMonth();
|
||||
var targetMonth = mo - m;
|
||||
while (targetMonth < 0) { targetMonth += 12; y -= 1; }
|
||||
var mk = y + '-' + String(targetMonth + 1).padStart(2, '0');
|
||||
var workedHours = parseFloat((monthMap[mk] || 0) / 3600).toFixed(1);
|
||||
if (parseFloat(workedHours) === 0) continue;
|
||||
var diff = parseFloat(workedHours) - targetHours;
|
||||
totalBalance += diff;
|
||||
var diffClass = diff >= 0 ? 'diff-positive' : 'diff-negative';
|
||||
var diffStr = (diff >= 0 ? '+' : '') + diff.toFixed(1) + 'h';
|
||||
monthRows += '<tr><td>' + monthNames[targetMonth] + ' ' + y + '</td><td>' + workedHours + 'h</td><td class="' + diffClass + '">' + diffStr + '</td></tr>';
|
||||
}
|
||||
document.getElementById('monthly-table-body').innerHTML = monthRows;
|
||||
var balanceEl = document.getElementById('time-12month-balance');
|
||||
var balanceStr = (totalBalance >= 0 ? '+' : '') + totalBalance.toFixed(1) + 'h';
|
||||
balanceEl.textContent = balanceStr;
|
||||
balanceEl.className = 'stat-value ' + (totalBalance >= 0 ? 'positive' : 'negative');
|
||||
|
||||
// Distribution chart - donut
|
||||
new ApexCharts(document.querySelector("#chart-distribution"), {
|
||||
chart: { type: 'donut', height: 400, background: 'transparent' },
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue