wukong-gitlog-cli 1.0.28 → 1.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/package.json +1 -1
- package/web/app.js +113 -13
- package/web/index.html +9 -8
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [1.0.29](https://github.com/tomatobybike/wukong-gitlog-cli/compare/v1.0.28...v1.0.29) (2025-12-09)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* 🎸 drawer title ([20bd05a](https://github.com/tomatobybike/wukong-gitlog-cli/commit/20bd05a2d395f803374845d78628ac0d79c99dfa))
|
|
11
|
+
|
|
5
12
|
### [1.0.28](https://github.com/tomatobybike/wukong-gitlog-cli/compare/v1.0.27...v1.0.28) (2025-12-09)
|
|
6
13
|
|
|
7
14
|
|
package/package.json
CHANGED
package/web/app.js
CHANGED
|
@@ -279,13 +279,14 @@ function drawHourlyOvertime(stats, onHourClick) {
|
|
|
279
279
|
}
|
|
280
280
|
|
|
281
281
|
// showSideBarForHour 实现
|
|
282
|
-
function showSideBarForHour(hour, commitsOrCount) {
|
|
282
|
+
function showSideBarForHour({ hour, commitsOrCount, titleDrawer }) {
|
|
283
283
|
// 支持传入 number(仅次数)或 array(详细 commit 列表)
|
|
284
284
|
// 统一复用通用详情侧栏 DOM
|
|
285
285
|
const sidebar = document.getElementById('dayDetailSidebar')
|
|
286
286
|
const backdrop = document.getElementById('sidebarBackdrop')
|
|
287
287
|
const titleEl = document.getElementById('sidebarTitle')
|
|
288
288
|
const contentEl = document.getElementById('sidebarContent')
|
|
289
|
+
const drawerTitleEl = document.getElementById('sidebarDrawerTitle')
|
|
289
290
|
|
|
290
291
|
// 兼容未传入侧栏 DOM 的情况(优雅降级)
|
|
291
292
|
if (!sidebar || !titleEl || !contentEl) {
|
|
@@ -295,6 +296,7 @@ function showSideBarForHour(hour, commitsOrCount) {
|
|
|
295
296
|
return
|
|
296
297
|
}
|
|
297
298
|
|
|
299
|
+
drawerTitleEl.innerHTML = titleDrawer || '🕒 小时详情'
|
|
298
300
|
titleEl.innerHTML = `🕒 ${String(hour).padStart(2, '0')}:00 - ${String(hour).padStart(2, '0')}:59`
|
|
299
301
|
|
|
300
302
|
// 如果只是 number,显示计数
|
|
@@ -382,6 +384,8 @@ function drawDailyTrend(commits, onDayClick) {
|
|
|
382
384
|
const data = labels.map((l) => map.get(l))
|
|
383
385
|
|
|
384
386
|
const el = document.getElementById('dailyTrendChart')
|
|
387
|
+
const titleDrawer = el.getAttribute('data-title') || ''
|
|
388
|
+
|
|
385
389
|
// eslint-disable-next-line no-undef
|
|
386
390
|
const chart = echarts.init(el)
|
|
387
391
|
|
|
@@ -474,21 +478,29 @@ function drawDailyTrend(commits, onDayClick) {
|
|
|
474
478
|
const dayCommits = commits.filter(
|
|
475
479
|
(c) => new Date(c.date).toISOString().slice(0, 10) === date
|
|
476
480
|
)
|
|
477
|
-
onDayClick(date, count, dayCommits)
|
|
481
|
+
// onDayClick(date, count, dayCommits)
|
|
482
|
+
onDayClick({
|
|
483
|
+
date,
|
|
484
|
+
count,
|
|
485
|
+
commits: dayCommits,
|
|
486
|
+
titleDrawer
|
|
487
|
+
})
|
|
478
488
|
})
|
|
479
489
|
}
|
|
480
490
|
|
|
481
491
|
return chart
|
|
482
492
|
}
|
|
483
493
|
|
|
484
|
-
function showSideBarForWeek(period, weeklyItem, commits = []) {
|
|
494
|
+
function showSideBarForWeek({ period, weeklyItem, commits = [], titleDrawer }) {
|
|
485
495
|
// 统一复用通用详情侧栏 DOM
|
|
486
496
|
const sidebar = document.getElementById('dayDetailSidebar')
|
|
487
497
|
const backdrop = document.getElementById('sidebarBackdrop')
|
|
488
498
|
const titleEl = document.getElementById('sidebarTitle')
|
|
489
499
|
const contentEl = document.getElementById('sidebarContent')
|
|
500
|
+
const drawerTitleEl = document.getElementById('sidebarDrawerTitle')
|
|
490
501
|
|
|
491
502
|
titleEl.innerHTML = `📅 周期:<b>${period}</b>`
|
|
503
|
+
drawerTitleEl.innerHTML = titleDrawer || ''
|
|
492
504
|
|
|
493
505
|
let html = `
|
|
494
506
|
<div style="padding:6px 0;">
|
|
@@ -532,6 +544,8 @@ function drawWeeklyTrend(weekly, commits, onWeekClick) {
|
|
|
532
544
|
const dataCount = weekly.map((w) => w.outsideWorkCount)
|
|
533
545
|
|
|
534
546
|
const el = document.getElementById('weeklyTrendChart')
|
|
547
|
+
const titleDrawer = el.getAttribute('data-title') || ''
|
|
548
|
+
|
|
535
549
|
const chart = echarts.init(el)
|
|
536
550
|
|
|
537
551
|
chart.setOption({
|
|
@@ -634,7 +648,13 @@ function drawWeeklyTrend(weekly, commits, onWeekClick) {
|
|
|
634
648
|
|
|
635
649
|
// 回调交给外面决定如何打开侧栏
|
|
636
650
|
if (typeof onWeekClick === 'function') {
|
|
637
|
-
onWeekClick(w.period, w, weeklyCommits)
|
|
651
|
+
// onWeekClick(w.period, w, weeklyCommits)
|
|
652
|
+
onWeekClick({
|
|
653
|
+
period: w.period,
|
|
654
|
+
weeklyItem: w,
|
|
655
|
+
commits: weeklyCommits,
|
|
656
|
+
titleDrawer
|
|
657
|
+
})
|
|
638
658
|
}
|
|
639
659
|
})
|
|
640
660
|
|
|
@@ -648,6 +668,7 @@ function drawMonthlyTrend(monthly, commits, onMonthClick) {
|
|
|
648
668
|
const dataRate = monthly.map((m) => +(m.outsideWorkRate * 100).toFixed(1)) // 0–100%
|
|
649
669
|
|
|
650
670
|
const el = document.getElementById('monthlyTrendChart')
|
|
671
|
+
const titleDrawer = el.getAttribute('data-title') || ''
|
|
651
672
|
// eslint-disable-next-line no-undef
|
|
652
673
|
const chart = echarts.init(el)
|
|
653
674
|
|
|
@@ -750,7 +771,13 @@ function drawMonthlyTrend(monthly, commits, onMonthClick) {
|
|
|
750
771
|
)}`
|
|
751
772
|
return m === ym
|
|
752
773
|
})
|
|
753
|
-
onMonthClick(ym, monthCommits.length, monthCommits)
|
|
774
|
+
// onMonthClick(ym, monthCommits.length, monthCommits)
|
|
775
|
+
onMonthClick({
|
|
776
|
+
date: ym,
|
|
777
|
+
count: monthCommits.length,
|
|
778
|
+
commits: monthCommits,
|
|
779
|
+
titleDrawer
|
|
780
|
+
})
|
|
754
781
|
})
|
|
755
782
|
}
|
|
756
783
|
|
|
@@ -787,6 +814,8 @@ function drawLatestHourDaily(latestByDay, commits, onDayClick) {
|
|
|
787
814
|
const maxV = numericValues.length > 0 ? Math.max(...numericValues) : 0
|
|
788
815
|
|
|
789
816
|
const el = document.getElementById('latestHourDailyChart')
|
|
817
|
+
const titleDrawer = el.getAttribute('data-title') || ''
|
|
818
|
+
|
|
790
819
|
// eslint-disable-next-line no-undef
|
|
791
820
|
const chart = echarts.init(el)
|
|
792
821
|
|
|
@@ -886,7 +915,13 @@ function drawLatestHourDaily(latestByDay, commits, onDayClick) {
|
|
|
886
915
|
const idx = params.dataIndex
|
|
887
916
|
const date = labels[idx]
|
|
888
917
|
const list = dayCommitsMap[date] || []
|
|
889
|
-
onDayClick(date, list.length, list)
|
|
918
|
+
// onDayClick(date, list.length, list)
|
|
919
|
+
onDayClick({
|
|
920
|
+
date,
|
|
921
|
+
count: list.length,
|
|
922
|
+
commits: list,
|
|
923
|
+
titleDrawer
|
|
924
|
+
})
|
|
890
925
|
})
|
|
891
926
|
}
|
|
892
927
|
|
|
@@ -910,6 +945,8 @@ function drawDailySeverity(latestByDay, commits, onDayClick) {
|
|
|
910
945
|
const sev = raw.map((v) => (v == null ? 0 : Math.max(0, Number(v) - endH)))
|
|
911
946
|
|
|
912
947
|
const el = document.getElementById('dailySeverityChart')
|
|
948
|
+
const titleDrawer = el.getAttribute('data-title') || ''
|
|
949
|
+
|
|
913
950
|
// eslint-disable-next-line no-undef
|
|
914
951
|
const chart = echarts.init(el)
|
|
915
952
|
|
|
@@ -1011,7 +1048,13 @@ function drawDailySeverity(latestByDay, commits, onDayClick) {
|
|
|
1011
1048
|
const idx = params.dataIndex
|
|
1012
1049
|
const date = labels[idx]
|
|
1013
1050
|
const list = dayCommitsMap[date] || []
|
|
1014
|
-
onDayClick(date, list.length, list)
|
|
1051
|
+
// onDayClick(date, list.length, list)
|
|
1052
|
+
onDayClick({
|
|
1053
|
+
date,
|
|
1054
|
+
count: list.length,
|
|
1055
|
+
commits: list,
|
|
1056
|
+
titleDrawer
|
|
1057
|
+
})
|
|
1015
1058
|
})
|
|
1016
1059
|
}
|
|
1017
1060
|
|
|
@@ -1122,6 +1165,8 @@ function drawDailyTrendSeverity(commits, weekly, onDayClick) {
|
|
|
1122
1165
|
|
|
1123
1166
|
// ---------- 7. 绘图 ----------
|
|
1124
1167
|
const el = document.getElementById('dailyTrendChartDog')
|
|
1168
|
+
const titleDrawer = el.getAttribute('data-title') || ''
|
|
1169
|
+
|
|
1125
1170
|
const chart = echarts.init(el)
|
|
1126
1171
|
|
|
1127
1172
|
chart.setOption({
|
|
@@ -1161,7 +1206,13 @@ function drawDailyTrendSeverity(commits, weekly, onDayClick) {
|
|
|
1161
1206
|
if (params.componentType === 'series') {
|
|
1162
1207
|
const date = labels[params.dataIndex]
|
|
1163
1208
|
const count = data[params.dataIndex]
|
|
1164
|
-
onDayClick(date, count, dayCommitsDetail[date])
|
|
1209
|
+
// onDayClick(date, count, dayCommitsDetail[date])
|
|
1210
|
+
onDayClick({
|
|
1211
|
+
date,
|
|
1212
|
+
count,
|
|
1213
|
+
commits: dayCommitsDetail[date],
|
|
1214
|
+
titleDrawer
|
|
1215
|
+
})
|
|
1165
1216
|
}
|
|
1166
1217
|
})
|
|
1167
1218
|
}
|
|
@@ -1176,13 +1227,15 @@ function drawDailyTrendSeverity(commits, weekly, onDayClick) {
|
|
|
1176
1227
|
}
|
|
1177
1228
|
}
|
|
1178
1229
|
|
|
1179
|
-
function showDayDetailSidebar(date, count, commits) {
|
|
1230
|
+
function showDayDetailSidebar({ date, count, commits, titleDrawer }) {
|
|
1180
1231
|
const sidebar = document.getElementById('dayDetailSidebar')
|
|
1181
1232
|
const backdrop = document.getElementById('sidebarBackdrop')
|
|
1182
1233
|
const title = document.getElementById('sidebarTitle')
|
|
1183
1234
|
const content = document.getElementById('sidebarContent')
|
|
1235
|
+
const drawerTitleEl = document.getElementById('sidebarDrawerTitle')
|
|
1184
1236
|
|
|
1185
1237
|
title.innerHTML = `📅 ${date}(${count} 次提交)`
|
|
1238
|
+
drawerTitleEl.innerHTML = titleDrawer || ''
|
|
1186
1239
|
|
|
1187
1240
|
// 渲染详情
|
|
1188
1241
|
content.innerHTML = commits
|
|
@@ -1392,11 +1445,52 @@ const drawChangeTrends = (stats) => {
|
|
|
1392
1445
|
if (!el) return null
|
|
1393
1446
|
const chart = echarts.init(el)
|
|
1394
1447
|
|
|
1395
|
-
function render(
|
|
1396
|
-
const { authors, allPeriods, series } = buildDataset(stats,
|
|
1448
|
+
function render(type) {
|
|
1449
|
+
const { authors, allPeriods, series } = buildDataset(stats, type)
|
|
1450
|
+
const ds = { authors, allPeriods, series }
|
|
1451
|
+
ds.rangeMap = {}
|
|
1397
1452
|
|
|
1453
|
+
for (const period of ds.allPeriods) {
|
|
1454
|
+
if (period.includes('-W')) {
|
|
1455
|
+
const [yy, ww] = period.split('-W')
|
|
1456
|
+
ds.rangeMap[period] = getISOWeekRange(Number(yy), Number(ww))
|
|
1457
|
+
}
|
|
1458
|
+
}
|
|
1398
1459
|
chart.setOption({
|
|
1399
|
-
tooltip: { trigger: 'axis' },
|
|
1460
|
+
// tooltip: { trigger: 'axis' },
|
|
1461
|
+
tooltip: {
|
|
1462
|
+
trigger: 'axis',
|
|
1463
|
+
formatter(params) {
|
|
1464
|
+
if (!params || !params.length) return ''
|
|
1465
|
+
|
|
1466
|
+
const p = params[0]
|
|
1467
|
+
const label = p.axisValue
|
|
1468
|
+
const isWeekly = type === 'weekly'
|
|
1469
|
+
|
|
1470
|
+
let extra = ''
|
|
1471
|
+
if (isWeekly && ds.rangeMap && ds.rangeMap[label]) {
|
|
1472
|
+
const { start, end } = ds.rangeMap[label]
|
|
1473
|
+
// extra = `<div style="margin-top:4px;color:#999;font-size:12px">
|
|
1474
|
+
// 周区间:${start} ~ ${end}
|
|
1475
|
+
// </div>`
|
|
1476
|
+
// TODO: remove debug log before production
|
|
1477
|
+
extra = ''
|
|
1478
|
+
}
|
|
1479
|
+
|
|
1480
|
+
const lines = params
|
|
1481
|
+
.filter((i) => i.data > 0)
|
|
1482
|
+
.map(
|
|
1483
|
+
(item) => `${item.marker}${item.seriesName}: ${item.data} 行变更`
|
|
1484
|
+
)
|
|
1485
|
+
.join('<br/>')
|
|
1486
|
+
|
|
1487
|
+
return `
|
|
1488
|
+
<div>${label}</div>
|
|
1489
|
+
${extra}
|
|
1490
|
+
${lines}
|
|
1491
|
+
`
|
|
1492
|
+
}
|
|
1493
|
+
},
|
|
1400
1494
|
legend: { data: authors },
|
|
1401
1495
|
xAxis: { type: 'category', data: allPeriods },
|
|
1402
1496
|
yAxis: { type: 'value' },
|
|
@@ -1511,6 +1605,7 @@ function drawAuthorOvertimeTrends(commits, stats) {
|
|
|
1511
1605
|
}
|
|
1512
1606
|
|
|
1513
1607
|
const lines = params
|
|
1608
|
+
.filter((i) => i.data > 0)
|
|
1514
1609
|
.map(
|
|
1515
1610
|
(item) => `${item.marker}${item.seriesName}: ${item.data} 小时`
|
|
1516
1611
|
)
|
|
@@ -2042,6 +2137,7 @@ function drawAuthorLatestOvertimeTrends(commits, stats) {
|
|
|
2042
2137
|
}
|
|
2043
2138
|
|
|
2044
2139
|
const lines = params
|
|
2140
|
+
.filter((i) => i.data > 0)
|
|
2045
2141
|
.map(
|
|
2046
2142
|
(item) => `${item.marker}${item.seriesName}: ${item.data} 小时`
|
|
2047
2143
|
)
|
|
@@ -2285,7 +2381,11 @@ async function main() {
|
|
|
2285
2381
|
// 使用举例
|
|
2286
2382
|
const hourCommitsDetail = groupCommitsByHour(commits)
|
|
2287
2383
|
// 将 commit 列表传给侧栏(若没有详情,则传空数组)
|
|
2288
|
-
showSideBarForHour(
|
|
2384
|
+
showSideBarForHour({
|
|
2385
|
+
hour,
|
|
2386
|
+
commitsOrCount: hourCommitsDetail[hour] || [],
|
|
2387
|
+
titleDrawer: '每小时加班分布'
|
|
2388
|
+
})
|
|
2289
2389
|
})
|
|
2290
2390
|
drawOutsideVsInside(stats)
|
|
2291
2391
|
|
package/web/index.html
CHANGED
|
@@ -25,33 +25,33 @@
|
|
|
25
25
|
<section id="charts">
|
|
26
26
|
<div class="chart-card">
|
|
27
27
|
<h2>每小时加班分布 (小时 -> 提交数)</h2>
|
|
28
|
-
<div id="hourlyOvertimeChart" class="echart"></div>
|
|
28
|
+
<div id="hourlyOvertimeChart" data-title="每小时加班分布" class="echart"></div>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
<div class="chart-card">
|
|
32
32
|
<h2>按日提交趋势</h2>
|
|
33
|
-
<div id="dailyTrendChart" class="echart"></div>
|
|
33
|
+
<div id="dailyTrendChart" data-title="按日提交趋势" class="echart"></div>
|
|
34
34
|
</div>
|
|
35
35
|
|
|
36
36
|
<div class="chart-card">
|
|
37
37
|
<h2>每周趋势(加班占比)</h2>
|
|
38
|
-
<div id="weeklyTrendChart" class="echart"></div>
|
|
38
|
+
<div id="weeklyTrendChart" data-title="每周趋势(加班占比)" class="echart"></div>
|
|
39
39
|
</div>
|
|
40
40
|
<div class="chart-card">
|
|
41
41
|
<h2>每月趋势(加班占比)</h2>
|
|
42
|
-
<div id="monthlyTrendChart" class="echart"></div>
|
|
42
|
+
<div id="monthlyTrendChart" data-title="每月趋势(加班占比)" class="echart"></div>
|
|
43
43
|
</div>
|
|
44
44
|
<div class="chart-card">
|
|
45
45
|
<h2>每日最晚提交时间(小时)</h2>
|
|
46
|
-
<div id="latestHourDailyChart" class="echart"></div>
|
|
46
|
+
<div id="latestHourDailyChart" data-title="每日最晚提交时间(小时)" class="echart"></div>
|
|
47
47
|
</div>
|
|
48
48
|
<div class="chart-card">
|
|
49
49
|
<h2>每日超过下班的小时数</h2>
|
|
50
|
-
<div id="dailySeverityChart" class="echart"></div>
|
|
50
|
+
<div id="dailySeverityChart" data-title="每日超过下班的小时数" class="echart"></div>
|
|
51
51
|
</div>
|
|
52
52
|
<div class="chart-card">
|
|
53
53
|
<h2>按日提交趋势</h2>
|
|
54
|
-
<div id="dailyTrendChartDog" class="echart"></div>
|
|
54
|
+
<div id="dailyTrendChartDog" data-title="按日提交趋势" class="echart"></div>
|
|
55
55
|
</div>
|
|
56
56
|
<div class="chart-card">
|
|
57
57
|
<div id="mostTiredDay"></div>
|
|
@@ -147,9 +147,10 @@
|
|
|
147
147
|
<div id="sidebarBackdrop" class="sidebar-backdrop"></div>
|
|
148
148
|
<div id="dayDetailSidebar" class="sidebar">
|
|
149
149
|
<div class="sidebar-header">
|
|
150
|
-
<span id="
|
|
150
|
+
<span id="sidebarDrawerTitle"></span>
|
|
151
151
|
<button id="sidebarClose">×</button>
|
|
152
152
|
</div>
|
|
153
|
+
<div id="sidebarTitle"></div>
|
|
153
154
|
<div id="sidebarContent" class="sidebar-content"></div>
|
|
154
155
|
</div>
|
|
155
156
|
|