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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wukong-gitlog-cli",
3
- "version": "1.0.28",
3
+ "version": "1.0.29",
4
4
  "description": "Advanced Git commit log exporter with Excel/JSON/TXT output, grouping, stats and CLI.",
5
5
  "keywords": [
6
6
  "git",
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(t) {
1396
- const { authors, allPeriods, series } = buildDataset(stats, t)
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(hour, hourCommitsDetail[hour] || [])
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="sidebarTitle"></span>
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