diff --git a/README.md b/README.md index 6f3324f..9e04ee6 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Check out our latest [blog post](https://muetsch.io/wakapi-s-year-2021.html), fe * ✅ Self-hosted ## 🚧 Roadmap -Plans for the near future mainly include, besides usual improvements and bug fixes, a UI redesign as well as additional types of charts and statistics (see [#101](https://github.com/muety/wakapi/issues/101), [#80](https://github.com/muety/wakapi/issues/80), [#76](https://github.com/muety/wakapi/issues/76), [#12](https://github.com/muety/wakapi/issues/12)). If you have feature requests or any kind of improvement proposals feel free to open an issue or share them in our [user survey](https://github.com/muety/wakapi/issues/82). +Plans for the near future mainly include, besides usual improvements and bug fixes, a UI redesign as well as additional types of charts and statistics (see [#101](https://github.com/muety/wakapi/issues/101), [#76](https://github.com/muety/wakapi/issues/76), [#12](https://github.com/muety/wakapi/issues/12)). If you have feature requests or any kind of improvement proposals feel free to open an issue or share them in our [user survey](https://github.com/muety/wakapi/issues/82). ## ⌨️ How to use? There are different options for how to use Wakapi, ranging from our hosted cloud service to self-hosting it. Regardless of which option choose, you will always have to do the [client setup](#-client-setup) in addition. @@ -59,8 +59,6 @@ There are different options for how to use Wakapi, ranging from our hosted cloud ### ☁️ Option 1: Use [wakapi.dev](https://wakapi.dev) If you want to try out a free, hosted cloud service, all you need to do is create an account and then set up your client-side tooling (see below). -However, we do not guarantee data persistence, so you might potentially lose your data if the service is taken down some day ❕ - ### 📦 Option 2: Quick-run a Release ```bash $ curl -L https://wakapi.dev/get | bash diff --git a/coverage/coverage.out b/coverage/coverage.out index 67c6dd3..cf0996d 100644 --- a/coverage/coverage.out +++ b/coverage/coverage.out @@ -1,4 +1,22 @@ mode: set +github.com/muety/wakapi/models/heartbeat.go:33.34,35.2 1 1 +github.com/muety/wakapi/models/heartbeat.go:37.65,39.46 2 1 +github.com/muety/wakapi/models/heartbeat.go:39.46,40.108 1 1 +github.com/muety/wakapi/models/heartbeat.go:40.108,43.4 2 1 +github.com/muety/wakapi/models/heartbeat.go:47.50,48.11 1 1 +github.com/muety/wakapi/models/heartbeat.go:63.2,63.15 1 1 +github.com/muety/wakapi/models/heartbeat.go:67.2,67.12 1 1 +github.com/muety/wakapi/models/heartbeat.go:49.22,50.18 1 1 +github.com/muety/wakapi/models/heartbeat.go:51.21,52.17 1 1 +github.com/muety/wakapi/models/heartbeat.go:53.23,54.19 1 1 +github.com/muety/wakapi/models/heartbeat.go:55.17,56.26 1 1 +github.com/muety/wakapi/models/heartbeat.go:57.22,58.18 1 1 +github.com/muety/wakapi/models/heartbeat.go:59.21,60.17 1 0 +github.com/muety/wakapi/models/heartbeat.go:63.15,65.3 1 1 +github.com/muety/wakapi/models/heartbeat.go:70.37,86.2 1 0 +github.com/muety/wakapi/models/heartbeat.go:94.41,96.16 2 0 +github.com/muety/wakapi/models/heartbeat.go:99.2,100.10 2 0 +github.com/muety/wakapi/models/heartbeat.go:96.16,98.3 1 0 github.com/muety/wakapi/models/heartbeats.go:7.31,9.2 1 0 github.com/muety/wakapi/models/heartbeats.go:11.41,13.2 1 0 github.com/muety/wakapi/models/heartbeats.go:15.36,17.2 1 0 @@ -28,55 +46,6 @@ github.com/muety/wakapi/models/mail_address.go:65.2,65.13 1 1 github.com/muety/wakapi/models/mail_address.go:60.22,61.17 1 1 github.com/muety/wakapi/models/mail_address.go:61.17,63.4 1 1 github.com/muety/wakapi/models/project_label.go:14.39,16.2 1 0 -github.com/muety/wakapi/models/heartbeat.go:33.34,35.2 1 1 -github.com/muety/wakapi/models/heartbeat.go:37.65,39.46 2 1 -github.com/muety/wakapi/models/heartbeat.go:39.46,40.108 1 1 -github.com/muety/wakapi/models/heartbeat.go:40.108,43.4 2 1 -github.com/muety/wakapi/models/heartbeat.go:47.50,48.11 1 1 -github.com/muety/wakapi/models/heartbeat.go:63.2,63.15 1 1 -github.com/muety/wakapi/models/heartbeat.go:67.2,67.12 1 1 -github.com/muety/wakapi/models/heartbeat.go:49.22,50.18 1 1 -github.com/muety/wakapi/models/heartbeat.go:51.21,52.17 1 1 -github.com/muety/wakapi/models/heartbeat.go:53.23,54.19 1 1 -github.com/muety/wakapi/models/heartbeat.go:55.17,56.26 1 1 -github.com/muety/wakapi/models/heartbeat.go:57.22,58.18 1 1 -github.com/muety/wakapi/models/heartbeat.go:59.21,60.17 1 0 -github.com/muety/wakapi/models/heartbeat.go:63.15,65.3 1 1 -github.com/muety/wakapi/models/heartbeat.go:70.37,86.2 1 0 -github.com/muety/wakapi/models/heartbeat.go:94.41,96.16 2 0 -github.com/muety/wakapi/models/heartbeat.go:99.2,100.10 2 0 -github.com/muety/wakapi/models/heartbeat.go:96.16,98.3 1 0 -github.com/muety/wakapi/models/interval.go:39.47,40.23 1 0 -github.com/muety/wakapi/models/interval.go:45.2,45.14 1 0 -github.com/muety/wakapi/models/interval.go:40.23,41.13 1 0 -github.com/muety/wakapi/models/interval.go:41.13,43.4 1 0 -github.com/muety/wakapi/models/language_mapping.go:11.42,13.2 1 0 -github.com/muety/wakapi/models/language_mapping.go:15.51,17.2 1 0 -github.com/muety/wakapi/models/language_mapping.go:19.52,21.2 1 0 -github.com/muety/wakapi/models/mail.go:19.44,23.2 3 0 -github.com/muety/wakapi/models/mail.go:25.44,29.2 3 0 -github.com/muety/wakapi/models/mail.go:31.32,44.2 1 0 -github.com/muety/wakapi/models/mail.go:46.41,48.2 1 0 -github.com/muety/wakapi/models/user.go:11.13,13.2 1 1 -github.com/muety/wakapi/models/user.go:82.36,83.22 1 1 -github.com/muety/wakapi/models/user.go:86.2,87.16 2 1 -github.com/muety/wakapi/models/user.go:90.2,90.11 1 1 -github.com/muety/wakapi/models/user.go:83.22,85.3 1 1 -github.com/muety/wakapi/models/user.go:87.16,89.3 1 0 -github.com/muety/wakapi/models/user.go:93.41,96.2 2 1 -github.com/muety/wakapi/models/user.go:98.53,101.54 3 0 -github.com/muety/wakapi/models/user.go:104.2,104.51 1 0 -github.com/muety/wakapi/models/user.go:107.2,107.20 1 0 -github.com/muety/wakapi/models/user.go:101.54,103.3 1 0 -github.com/muety/wakapi/models/user.go:104.51,106.3 1 0 -github.com/muety/wakapi/models/user.go:110.43,113.2 1 0 -github.com/muety/wakapi/models/user.go:115.45,118.2 1 0 -github.com/muety/wakapi/models/user.go:120.33,125.2 1 0 -github.com/muety/wakapi/models/user.go:127.41,129.2 1 0 -github.com/muety/wakapi/models/user.go:131.45,133.2 1 0 -github.com/muety/wakapi/models/user.go:135.45,137.2 1 0 -github.com/muety/wakapi/models/user.go:139.39,141.2 1 0 -github.com/muety/wakapi/models/user.go:143.39,146.2 2 0 github.com/muety/wakapi/models/alias.go:18.32,20.2 1 0 github.com/muety/wakapi/models/alias.go:22.37,23.35 1 0 github.com/muety/wakapi/models/alias.go:28.2,28.14 1 0 @@ -96,96 +65,6 @@ github.com/muety/wakapi/models/duration.go:57.17,58.26 1 0 github.com/muety/wakapi/models/duration.go:59.22,60.18 1 0 github.com/muety/wakapi/models/duration.go:61.21,62.17 1 0 github.com/muety/wakapi/models/duration.go:65.15,67.3 1 0 -github.com/muety/wakapi/models/durations.go:7.30,9.2 1 0 -github.com/muety/wakapi/models/durations.go:11.40,13.2 1 0 -github.com/muety/wakapi/models/durations.go:15.35,17.2 1 0 -github.com/muety/wakapi/models/durations.go:19.45,21.22 2 0 -github.com/muety/wakapi/models/durations.go:24.2,24.14 1 0 -github.com/muety/wakapi/models/durations.go:21.22,23.3 1 0 -github.com/muety/wakapi/models/durations.go:27.39,30.2 2 0 -github.com/muety/wakapi/models/durations.go:32.39,34.18 1 0 -github.com/muety/wakapi/models/durations.go:37.2,37.16 1 0 -github.com/muety/wakapi/models/durations.go:34.18,36.3 1 0 -github.com/muety/wakapi/models/durations.go:40.38,42.18 1 0 -github.com/muety/wakapi/models/durations.go:45.2,45.24 1 0 -github.com/muety/wakapi/models/durations.go:42.18,44.3 1 0 -github.com/muety/wakapi/models/summary.go:62.29,64.2 1 1 -github.com/muety/wakapi/models/summary.go:66.35,68.2 1 0 -github.com/muety/wakapi/models/summary.go:70.38,72.2 1 0 -github.com/muety/wakapi/models/summary.go:74.37,83.2 8 1 -github.com/muety/wakapi/models/summary.go:85.35,87.2 1 1 -github.com/muety/wakapi/models/summary.go:89.57,99.2 1 1 -github.com/muety/wakapi/models/summary.go:101.64,103.2 1 0 -github.com/muety/wakapi/models/summary.go:116.33,121.26 4 1 -github.com/muety/wakapi/models/summary.go:128.2,128.37 1 1 -github.com/muety/wakapi/models/summary.go:133.2,134.16 2 1 -github.com/muety/wakapi/models/summary.go:137.2,137.33 1 1 -github.com/muety/wakapi/models/summary.go:121.26,122.30 1 1 -github.com/muety/wakapi/models/summary.go:122.30,124.4 1 1 -github.com/muety/wakapi/models/summary.go:128.37,130.3 1 0 -github.com/muety/wakapi/models/summary.go:134.16,136.3 1 0 -github.com/muety/wakapi/models/summary.go:137.33,139.3 1 1 -github.com/muety/wakapi/models/summary.go:143.56,149.28 5 1 -github.com/muety/wakapi/models/summary.go:153.2,154.42 2 1 -github.com/muety/wakapi/models/summary.go:161.2,162.15 2 1 -github.com/muety/wakapi/models/summary.go:149.28,151.3 1 1 -github.com/muety/wakapi/models/summary.go:154.42,155.22 1 0 -github.com/muety/wakapi/models/summary.go:155.22,157.9 2 0 -github.com/muety/wakapi/models/summary.go:162.15,163.28 1 1 -github.com/muety/wakapi/models/summary.go:163.28,165.4 1 0 -github.com/muety/wakapi/models/summary.go:165.9,171.4 1 1 -github.com/muety/wakapi/models/summary.go:175.45,180.16 4 0 -github.com/muety/wakapi/models/summary.go:183.2,183.39 1 0 -github.com/muety/wakapi/models/summary.go:187.2,187.30 1 0 -github.com/muety/wakapi/models/summary.go:180.16,182.3 1 0 -github.com/muety/wakapi/models/summary.go:183.39,185.3 1 0 -github.com/muety/wakapi/models/summary.go:190.73,192.55 2 1 -github.com/muety/wakapi/models/summary.go:197.2,197.16 1 1 -github.com/muety/wakapi/models/summary.go:192.55,193.31 1 1 -github.com/muety/wakapi/models/summary.go:193.31,195.4 1 1 -github.com/muety/wakapi/models/summary.go:200.88,202.55 2 1 -github.com/muety/wakapi/models/summary.go:210.2,210.16 1 1 -github.com/muety/wakapi/models/summary.go:202.55,203.31 1 1 -github.com/muety/wakapi/models/summary.go:203.31,204.23 1 1 -github.com/muety/wakapi/models/summary.go:207.4,207.46 1 1 -github.com/muety/wakapi/models/summary.go:204.23,205.13 1 1 -github.com/muety/wakapi/models/summary.go:213.73,215.34 2 1 -github.com/muety/wakapi/models/summary.go:218.2,218.14 1 1 -github.com/muety/wakapi/models/summary.go:215.34,217.3 1 1 -github.com/muety/wakapi/models/summary.go:221.56,224.55 3 0 -github.com/muety/wakapi/models/summary.go:231.2,231.12 1 0 -github.com/muety/wakapi/models/summary.go:224.55,225.31 1 0 -github.com/muety/wakapi/models/summary.go:225.31,226.44 1 0 -github.com/muety/wakapi/models/summary.go:226.44,228.5 1 0 -github.com/muety/wakapi/models/summary.go:234.58,236.16 2 0 -github.com/muety/wakapi/models/summary.go:239.2,239.16 1 0 -github.com/muety/wakapi/models/summary.go:236.16,238.3 1 0 -github.com/muety/wakapi/models/summary.go:242.71,243.63 1 1 -github.com/muety/wakapi/models/summary.go:287.2,295.10 8 1 -github.com/muety/wakapi/models/summary.go:243.63,244.20 1 1 -github.com/muety/wakapi/models/summary.go:248.3,250.45 2 1 -github.com/muety/wakapi/models/summary.go:259.3,259.31 1 1 -github.com/muety/wakapi/models/summary.go:266.3,266.31 1 1 -github.com/muety/wakapi/models/summary.go:283.3,283.16 1 1 -github.com/muety/wakapi/models/summary.go:244.20,246.4 1 1 -github.com/muety/wakapi/models/summary.go:250.45,251.32 1 1 -github.com/muety/wakapi/models/summary.go:256.4,256.14 1 1 -github.com/muety/wakapi/models/summary.go:251.32,252.24 1 1 -github.com/muety/wakapi/models/summary.go:252.24,254.6 1 1 -github.com/muety/wakapi/models/summary.go:259.31,261.60 1 1 -github.com/muety/wakapi/models/summary.go:261.60,263.5 1 1 -github.com/muety/wakapi/models/summary.go:266.31,268.60 1 1 -github.com/muety/wakapi/models/summary.go:268.60,269.55 1 1 -github.com/muety/wakapi/models/summary.go:269.55,271.6 1 1 -github.com/muety/wakapi/models/summary.go:271.11,279.6 1 1 -github.com/muety/wakapi/models/summary.go:298.57,299.30 1 1 -github.com/muety/wakapi/models/summary.go:304.2,304.43 1 0 -github.com/muety/wakapi/models/summary.go:299.30,300.28 1 1 -github.com/muety/wakapi/models/summary.go:300.28,302.4 1 1 -github.com/muety/wakapi/models/summary.go:307.50,311.2 1 1 -github.com/muety/wakapi/models/summary.go:313.33,315.2 1 1 -github.com/muety/wakapi/models/summary.go:317.43,319.2 1 1 -github.com/muety/wakapi/models/summary.go:321.38,323.2 1 1 github.com/muety/wakapi/models/filters.go:21.33,23.2 1 1 github.com/muety/wakapi/models/filters.go:25.48,26.22 1 1 github.com/muety/wakapi/models/filters.go:31.2,31.14 1 1 @@ -256,6 +135,10 @@ github.com/muety/wakapi/models/filters.go:176.2,176.28 1 1 github.com/muety/wakapi/models/filters.go:179.2,179.10 1 1 github.com/muety/wakapi/models/filters.go:173.41,175.3 1 0 github.com/muety/wakapi/models/filters.go:176.28,178.3 1 1 +github.com/muety/wakapi/models/mail.go:19.44,23.2 3 0 +github.com/muety/wakapi/models/mail.go:25.44,29.2 3 0 +github.com/muety/wakapi/models/mail.go:31.32,44.2 1 0 +github.com/muety/wakapi/models/mail.go:46.41,48.2 1 0 github.com/muety/wakapi/models/models.go:3.14,5.2 0 1 github.com/muety/wakapi/models/shared.go:35.52,37.2 1 0 github.com/muety/wakapi/models/shared.go:39.52,42.16 3 0 @@ -272,155 +155,273 @@ github.com/muety/wakapi/models/shared.go:82.45,84.2 1 0 github.com/muety/wakapi/models/shared.go:86.37,88.2 1 0 github.com/muety/wakapi/models/shared.go:90.35,92.2 1 0 github.com/muety/wakapi/models/shared.go:94.34,96.2 1 0 -github.com/muety/wakapi/utils/collection.go:3.59,5.22 2 0 -github.com/muety/wakapi/utils/collection.go:8.2,8.15 1 0 -github.com/muety/wakapi/utils/collection.go:5.22,7.3 1 0 -github.com/muety/wakapi/utils/common.go:18.73,19.58 1 0 -github.com/muety/wakapi/utils/common.go:22.2,22.87 1 0 -github.com/muety/wakapi/utils/common.go:25.2,25.64 1 0 -github.com/muety/wakapi/utils/common.go:19.58,21.3 1 0 -github.com/muety/wakapi/utils/common.go:22.87,24.3 1 0 -github.com/muety/wakapi/utils/common.go:28.40,30.2 1 0 -github.com/muety/wakapi/utils/common.go:32.44,34.2 1 0 -github.com/muety/wakapi/utils/common.go:36.49,38.2 1 0 -github.com/muety/wakapi/utils/common.go:40.45,42.2 1 0 -github.com/muety/wakapi/utils/common.go:44.24,46.2 1 0 -github.com/muety/wakapi/utils/common.go:48.56,51.45 3 1 -github.com/muety/wakapi/utils/common.go:54.2,54.40 1 1 -github.com/muety/wakapi/utils/common.go:51.45,53.3 1 1 -github.com/muety/wakapi/utils/date.go:8.43,10.2 1 1 -github.com/muety/wakapi/utils/date.go:12.48,14.2 1 0 -github.com/muety/wakapi/utils/date.go:16.41,18.21 2 1 -github.com/muety/wakapi/utils/date.go:21.2,21.23 1 1 -github.com/muety/wakapi/utils/date.go:18.21,20.3 1 0 -github.com/muety/wakapi/utils/date.go:24.46,26.2 1 0 -github.com/muety/wakapi/utils/date.go:28.51,30.2 1 0 -github.com/muety/wakapi/utils/date.go:32.44,35.2 2 1 -github.com/muety/wakapi/utils/date.go:37.52,39.2 1 0 -github.com/muety/wakapi/utils/date.go:41.45,43.2 1 0 -github.com/muety/wakapi/utils/date.go:45.51,47.2 1 0 -github.com/muety/wakapi/utils/date.go:49.44,51.2 1 0 -github.com/muety/wakapi/utils/date.go:54.42,56.2 1 1 -github.com/muety/wakapi/utils/date.go:59.46,61.2 1 0 -github.com/muety/wakapi/utils/date.go:64.41,66.21 2 1 -github.com/muety/wakapi/utils/date.go:69.2,69.33 1 1 -github.com/muety/wakapi/utils/date.go:66.21,68.3 1 1 -github.com/muety/wakapi/utils/date.go:73.63,75.2 1 0 -github.com/muety/wakapi/utils/date.go:78.62,84.2 5 0 -github.com/muety/wakapi/utils/date.go:87.67,90.33 2 1 -github.com/muety/wakapi/utils/date.go:99.2,99.18 1 1 -github.com/muety/wakapi/utils/date.go:90.33,92.19 2 1 -github.com/muety/wakapi/utils/date.go:95.3,96.10 2 1 -github.com/muety/wakapi/utils/date.go:92.19,94.4 1 1 -github.com/muety/wakapi/utils/date.go:102.50,108.2 5 0 -github.com/muety/wakapi/utils/date.go:111.79,114.36 3 1 -github.com/muety/wakapi/utils/date.go:118.2,118.21 1 1 -github.com/muety/wakapi/utils/date.go:122.2,122.21 1 1 -github.com/muety/wakapi/utils/date.go:126.2,126.13 1 1 -github.com/muety/wakapi/utils/date.go:114.36,117.3 2 0 -github.com/muety/wakapi/utils/date.go:118.21,121.3 2 1 -github.com/muety/wakapi/utils/date.go:122.21,125.3 2 1 -github.com/muety/wakapi/utils/http.go:9.90,12.58 3 0 -github.com/muety/wakapi/utils/http.go:12.58,14.3 1 0 -github.com/muety/wakapi/utils/set.go:3.51,5.26 2 0 -github.com/muety/wakapi/utils/set.go:8.2,8.12 1 0 -github.com/muety/wakapi/utils/set.go:5.26,7.3 1 0 -github.com/muety/wakapi/utils/set.go:11.49,13.21 2 0 -github.com/muety/wakapi/utils/set.go:16.2,16.14 1 0 -github.com/muety/wakapi/utils/set.go:13.21,15.3 1 0 -github.com/muety/wakapi/utils/strings.go:8.34,10.2 1 0 -github.com/muety/wakapi/utils/strings.go:12.77,13.29 1 0 -github.com/muety/wakapi/utils/strings.go:18.2,18.19 1 0 -github.com/muety/wakapi/utils/strings.go:13.29,14.18 1 0 -github.com/muety/wakapi/utils/strings.go:14.18,16.4 1 0 -github.com/muety/wakapi/utils/summary.go:10.66,11.40 1 0 -github.com/muety/wakapi/utils/summary.go:16.2,16.48 1 0 -github.com/muety/wakapi/utils/summary.go:11.40,12.27 1 0 -github.com/muety/wakapi/utils/summary.go:12.27,14.4 1 0 -github.com/muety/wakapi/utils/summary.go:19.88,22.2 2 0 -github.com/muety/wakapi/utils/summary.go:24.95,26.16 2 0 -github.com/muety/wakapi/utils/summary.go:29.2,29.38 1 0 -github.com/muety/wakapi/utils/summary.go:26.16,28.3 1 0 -github.com/muety/wakapi/utils/summary.go:32.105,36.18 3 0 -github.com/muety/wakapi/utils/summary.go:71.2,71.22 1 0 -github.com/muety/wakapi/utils/summary.go:37.28,38.26 1 0 -github.com/muety/wakapi/utils/summary.go:39.32,41.24 2 0 -github.com/muety/wakapi/utils/summary.go:42.31,43.29 1 0 -github.com/muety/wakapi/utils/summary.go:44.31,46.27 2 0 -github.com/muety/wakapi/utils/summary.go:47.32,48.30 1 0 -github.com/muety/wakapi/utils/summary.go:49.32,51.28 2 0 -github.com/muety/wakapi/utils/summary.go:52.31,53.29 1 0 -github.com/muety/wakapi/utils/summary.go:54.32,55.31 1 0 -github.com/muety/wakapi/utils/summary.go:56.41,58.42 2 0 -github.com/muety/wakapi/utils/summary.go:59.33,60.32 1 0 -github.com/muety/wakapi/utils/summary.go:61.33,62.32 1 0 -github.com/muety/wakapi/utils/summary.go:63.35,64.32 1 0 -github.com/muety/wakapi/utils/summary.go:65.26,66.21 1 0 -github.com/muety/wakapi/utils/summary.go:67.10,68.39 1 0 -github.com/muety/wakapi/utils/summary.go:74.73,81.56 5 0 -github.com/muety/wakapi/utils/summary.go:97.2,104.8 2 0 -github.com/muety/wakapi/utils/summary.go:81.56,83.3 1 0 -github.com/muety/wakapi/utils/summary.go:83.8,83.54 1 0 -github.com/muety/wakapi/utils/summary.go:83.54,85.3 1 0 -github.com/muety/wakapi/utils/summary.go:85.8,87.17 2 0 -github.com/muety/wakapi/utils/summary.go:91.3,92.17 2 0 -github.com/muety/wakapi/utils/summary.go:87.17,89.4 1 0 -github.com/muety/wakapi/utils/summary.go:92.17,94.4 1 0 -github.com/muety/wakapi/utils/summary.go:107.48,111.51 2 0 -github.com/muety/wakapi/utils/summary.go:114.2,114.12 1 0 -github.com/muety/wakapi/utils/summary.go:111.51,113.3 1 0 -github.com/muety/wakapi/utils/auth.go:16.79,18.54 2 0 -github.com/muety/wakapi/utils/auth.go:22.2,24.16 3 0 -github.com/muety/wakapi/utils/auth.go:28.2,30.45 3 0 -github.com/muety/wakapi/utils/auth.go:33.2,34.32 2 0 -github.com/muety/wakapi/utils/auth.go:18.54,20.3 1 0 -github.com/muety/wakapi/utils/auth.go:24.16,26.3 1 0 -github.com/muety/wakapi/utils/auth.go:30.45,32.3 1 0 -github.com/muety/wakapi/utils/auth.go:37.65,39.85 2 0 -github.com/muety/wakapi/utils/auth.go:43.2,44.30 2 0 -github.com/muety/wakapi/utils/auth.go:39.85,41.3 1 0 -github.com/muety/wakapi/utils/auth.go:47.94,49.16 2 0 -github.com/muety/wakapi/utils/auth.go:53.2,53.107 1 0 -github.com/muety/wakapi/utils/auth.go:57.2,57.22 1 0 -github.com/muety/wakapi/utils/auth.go:49.16,51.3 1 0 -github.com/muety/wakapi/utils/auth.go:53.107,55.3 1 0 -github.com/muety/wakapi/utils/auth.go:60.56,64.2 3 0 -github.com/muety/wakapi/utils/auth.go:66.55,69.16 3 0 -github.com/muety/wakapi/utils/auth.go:72.2,72.16 1 0 -github.com/muety/wakapi/utils/auth.go:69.16,71.3 1 0 -github.com/muety/wakapi/utils/db.go:8.34,9.37 1 0 -github.com/muety/wakapi/utils/db.go:17.2,18.14 2 0 -github.com/muety/wakapi/utils/db.go:9.37,11.110 2 0 -github.com/muety/wakapi/utils/db.go:15.3,15.20 1 0 -github.com/muety/wakapi/utils/db.go:11.110,14.4 2 0 -github.com/muety/wakapi/utils/db.go:21.39,22.37 1 0 -github.com/muety/wakapi/utils/db.go:30.2,31.14 2 0 -github.com/muety/wakapi/utils/db.go:22.37,24.119 2 0 -github.com/muety/wakapi/utils/db.go:28.3,28.20 1 0 -github.com/muety/wakapi/utils/db.go:24.119,27.4 2 0 -github.com/muety/wakapi/utils/template.go:13.41,15.16 2 0 -github.com/muety/wakapi/utils/template.go:18.2,18.23 1 0 -github.com/muety/wakapi/utils/template.go:15.16,17.3 1 0 -github.com/muety/wakapi/utils/template.go:21.37,22.30 1 0 -github.com/muety/wakapi/utils/template.go:25.2,25.10 1 0 -github.com/muety/wakapi/utils/template.go:22.30,24.3 1 0 -github.com/muety/wakapi/utils/template.go:28.83,33.16 4 0 -github.com/muety/wakapi/utils/template.go:37.2,37.29 1 0 -github.com/muety/wakapi/utils/template.go:62.2,62.23 1 0 -github.com/muety/wakapi/utils/template.go:33.16,35.3 1 0 -github.com/muety/wakapi/utils/template.go:37.29,39.51 2 0 -github.com/muety/wakapi/utils/template.go:43.3,44.17 2 0 -github.com/muety/wakapi/utils/template.go:47.3,48.17 2 0 -github.com/muety/wakapi/utils/template.go:52.3,55.17 3 0 -github.com/muety/wakapi/utils/template.go:59.3,59.27 1 0 -github.com/muety/wakapi/utils/template.go:39.51,40.12 1 0 -github.com/muety/wakapi/utils/template.go:44.17,46.4 1 0 -github.com/muety/wakapi/utils/template.go:48.17,50.4 1 0 -github.com/muety/wakapi/utils/template.go:55.17,57.4 1 0 -github.com/muety/wakapi/utils/color.go:8.90,10.32 2 0 -github.com/muety/wakapi/utils/color.go:15.2,15.15 1 0 -github.com/muety/wakapi/utils/color.go:10.32,11.50 1 0 -github.com/muety/wakapi/utils/color.go:11.50,13.4 1 0 +github.com/muety/wakapi/models/durations.go:7.30,9.2 1 0 +github.com/muety/wakapi/models/durations.go:11.40,13.2 1 0 +github.com/muety/wakapi/models/durations.go:15.35,17.2 1 0 +github.com/muety/wakapi/models/durations.go:19.45,21.22 2 0 +github.com/muety/wakapi/models/durations.go:24.2,24.14 1 0 +github.com/muety/wakapi/models/durations.go:21.22,23.3 1 0 +github.com/muety/wakapi/models/durations.go:27.39,30.2 2 0 +github.com/muety/wakapi/models/durations.go:32.39,34.18 1 0 +github.com/muety/wakapi/models/durations.go:37.2,37.16 1 0 +github.com/muety/wakapi/models/durations.go:34.18,36.3 1 0 +github.com/muety/wakapi/models/durations.go:40.38,42.18 1 0 +github.com/muety/wakapi/models/durations.go:45.2,45.24 1 0 +github.com/muety/wakapi/models/durations.go:42.18,44.3 1 0 +github.com/muety/wakapi/models/language_mapping.go:11.42,13.2 1 0 +github.com/muety/wakapi/models/language_mapping.go:15.51,17.2 1 0 +github.com/muety/wakapi/models/language_mapping.go:19.52,21.2 1 0 +github.com/muety/wakapi/models/summary.go:63.29,65.2 1 1 +github.com/muety/wakapi/models/summary.go:67.35,69.2 1 0 +github.com/muety/wakapi/models/summary.go:71.38,73.2 1 0 +github.com/muety/wakapi/models/summary.go:75.37,84.2 8 1 +github.com/muety/wakapi/models/summary.go:86.35,88.2 1 1 +github.com/muety/wakapi/models/summary.go:90.57,100.2 1 1 +github.com/muety/wakapi/models/summary.go:102.64,104.2 1 0 +github.com/muety/wakapi/models/summary.go:117.33,122.26 4 1 +github.com/muety/wakapi/models/summary.go:129.2,129.37 1 1 +github.com/muety/wakapi/models/summary.go:134.2,135.16 2 1 +github.com/muety/wakapi/models/summary.go:138.2,138.33 1 1 +github.com/muety/wakapi/models/summary.go:122.26,123.30 1 1 +github.com/muety/wakapi/models/summary.go:123.30,125.4 1 1 +github.com/muety/wakapi/models/summary.go:129.37,131.3 1 0 +github.com/muety/wakapi/models/summary.go:135.16,137.3 1 0 +github.com/muety/wakapi/models/summary.go:138.33,140.3 1 1 +github.com/muety/wakapi/models/summary.go:144.56,150.28 5 1 +github.com/muety/wakapi/models/summary.go:154.2,155.42 2 1 +github.com/muety/wakapi/models/summary.go:162.2,163.15 2 1 +github.com/muety/wakapi/models/summary.go:150.28,152.3 1 1 +github.com/muety/wakapi/models/summary.go:155.42,156.22 1 0 +github.com/muety/wakapi/models/summary.go:156.22,158.9 2 0 +github.com/muety/wakapi/models/summary.go:163.15,164.28 1 1 +github.com/muety/wakapi/models/summary.go:164.28,166.4 1 0 +github.com/muety/wakapi/models/summary.go:166.9,172.4 1 1 +github.com/muety/wakapi/models/summary.go:176.45,181.16 4 0 +github.com/muety/wakapi/models/summary.go:184.2,184.39 1 0 +github.com/muety/wakapi/models/summary.go:188.2,188.30 1 0 +github.com/muety/wakapi/models/summary.go:181.16,183.3 1 0 +github.com/muety/wakapi/models/summary.go:184.39,186.3 1 0 +github.com/muety/wakapi/models/summary.go:191.73,193.55 2 1 +github.com/muety/wakapi/models/summary.go:198.2,198.16 1 1 +github.com/muety/wakapi/models/summary.go:193.55,194.31 1 1 +github.com/muety/wakapi/models/summary.go:194.31,196.4 1 1 +github.com/muety/wakapi/models/summary.go:201.88,203.55 2 1 +github.com/muety/wakapi/models/summary.go:211.2,211.16 1 1 +github.com/muety/wakapi/models/summary.go:203.55,204.31 1 1 +github.com/muety/wakapi/models/summary.go:204.31,205.23 1 1 +github.com/muety/wakapi/models/summary.go:208.4,208.46 1 1 +github.com/muety/wakapi/models/summary.go:205.23,206.13 1 1 +github.com/muety/wakapi/models/summary.go:214.73,216.34 2 1 +github.com/muety/wakapi/models/summary.go:219.2,219.14 1 1 +github.com/muety/wakapi/models/summary.go:216.34,218.3 1 1 +github.com/muety/wakapi/models/summary.go:222.56,225.55 3 0 +github.com/muety/wakapi/models/summary.go:232.2,232.12 1 0 +github.com/muety/wakapi/models/summary.go:225.55,226.31 1 0 +github.com/muety/wakapi/models/summary.go:226.31,227.44 1 0 +github.com/muety/wakapi/models/summary.go:227.44,229.5 1 0 +github.com/muety/wakapi/models/summary.go:235.58,237.16 2 0 +github.com/muety/wakapi/models/summary.go:240.2,240.16 1 0 +github.com/muety/wakapi/models/summary.go:237.16,239.3 1 0 +github.com/muety/wakapi/models/summary.go:243.71,244.63 1 1 +github.com/muety/wakapi/models/summary.go:288.2,296.10 8 1 +github.com/muety/wakapi/models/summary.go:244.63,245.20 1 1 +github.com/muety/wakapi/models/summary.go:249.3,251.45 2 1 +github.com/muety/wakapi/models/summary.go:260.3,260.31 1 1 +github.com/muety/wakapi/models/summary.go:267.3,267.31 1 1 +github.com/muety/wakapi/models/summary.go:284.3,284.16 1 1 +github.com/muety/wakapi/models/summary.go:245.20,247.4 1 1 +github.com/muety/wakapi/models/summary.go:251.45,252.32 1 1 +github.com/muety/wakapi/models/summary.go:257.4,257.14 1 1 +github.com/muety/wakapi/models/summary.go:252.32,253.24 1 1 +github.com/muety/wakapi/models/summary.go:253.24,255.6 1 1 +github.com/muety/wakapi/models/summary.go:260.31,262.60 1 1 +github.com/muety/wakapi/models/summary.go:262.60,264.5 1 1 +github.com/muety/wakapi/models/summary.go:267.31,269.60 1 1 +github.com/muety/wakapi/models/summary.go:269.60,270.55 1 1 +github.com/muety/wakapi/models/summary.go:270.55,272.6 1 1 +github.com/muety/wakapi/models/summary.go:272.11,280.6 1 1 +github.com/muety/wakapi/models/summary.go:299.57,300.30 1 1 +github.com/muety/wakapi/models/summary.go:305.2,305.43 1 0 +github.com/muety/wakapi/models/summary.go:300.30,301.28 1 1 +github.com/muety/wakapi/models/summary.go:301.28,303.4 1 1 +github.com/muety/wakapi/models/summary.go:308.43,310.2 1 0 +github.com/muety/wakapi/models/summary.go:312.49,313.21 1 0 +github.com/muety/wakapi/models/summary.go:316.2,317.54 2 0 +github.com/muety/wakapi/models/summary.go:313.21,315.3 1 0 +github.com/muety/wakapi/models/summary.go:320.51,321.27 1 0 +github.com/muety/wakapi/models/summary.go:324.2,325.19 2 0 +github.com/muety/wakapi/models/summary.go:321.27,323.3 1 0 +github.com/muety/wakapi/models/summary.go:328.50,332.2 1 1 +github.com/muety/wakapi/models/summary.go:334.33,336.2 1 1 +github.com/muety/wakapi/models/summary.go:338.43,340.2 1 1 +github.com/muety/wakapi/models/summary.go:342.38,344.2 1 1 +github.com/muety/wakapi/models/user.go:11.13,13.2 1 1 +github.com/muety/wakapi/models/user.go:82.36,83.22 1 1 +github.com/muety/wakapi/models/user.go:86.2,87.16 2 1 +github.com/muety/wakapi/models/user.go:90.2,90.11 1 1 +github.com/muety/wakapi/models/user.go:83.22,85.3 1 1 +github.com/muety/wakapi/models/user.go:87.16,89.3 1 0 +github.com/muety/wakapi/models/user.go:93.41,96.2 2 1 +github.com/muety/wakapi/models/user.go:98.53,101.54 3 0 +github.com/muety/wakapi/models/user.go:104.2,104.51 1 0 +github.com/muety/wakapi/models/user.go:107.2,107.20 1 0 +github.com/muety/wakapi/models/user.go:101.54,103.3 1 0 +github.com/muety/wakapi/models/user.go:104.51,106.3 1 0 +github.com/muety/wakapi/models/user.go:110.43,113.2 1 0 +github.com/muety/wakapi/models/user.go:115.45,118.2 1 0 +github.com/muety/wakapi/models/user.go:120.33,125.2 1 0 +github.com/muety/wakapi/models/user.go:127.41,129.2 1 0 +github.com/muety/wakapi/models/user.go:131.45,133.2 1 0 +github.com/muety/wakapi/models/user.go:135.45,137.2 1 0 +github.com/muety/wakapi/models/user.go:139.39,141.2 1 0 +github.com/muety/wakapi/models/user.go:143.39,146.2 2 0 +github.com/muety/wakapi/models/interval.go:39.47,40.23 1 0 +github.com/muety/wakapi/models/interval.go:45.2,45.14 1 0 +github.com/muety/wakapi/models/interval.go:40.23,41.13 1 0 +github.com/muety/wakapi/models/interval.go:41.13,43.4 1 0 +github.com/muety/wakapi/middlewares/principal.go:15.62,17.2 1 0 +github.com/muety/wakapi/middlewares/principal.go:19.58,21.2 1 0 +github.com/muety/wakapi/middlewares/principal.go:42.71,43.43 1 0 +github.com/muety/wakapi/middlewares/principal.go:43.43,45.3 1 0 +github.com/muety/wakapi/middlewares/principal.go:48.81,51.2 2 0 +github.com/muety/wakapi/middlewares/principal.go:53.55,54.52 1 0 +github.com/muety/wakapi/middlewares/principal.go:54.52,56.3 1 0 +github.com/muety/wakapi/middlewares/principal.go:59.49,60.52 1 0 +github.com/muety/wakapi/middlewares/principal.go:63.2,63.12 1 0 +github.com/muety/wakapi/middlewares/principal.go:60.52,62.3 1 0 +github.com/muety/wakapi/middlewares/security.go:19.62,20.43 1 0 +github.com/muety/wakapi/middlewares/security.go:20.43,22.3 1 0 +github.com/muety/wakapi/middlewares/security.go:25.80,26.36 1 0 +github.com/muety/wakapi/middlewares/security.go:31.2,31.27 1 0 +github.com/muety/wakapi/middlewares/security.go:26.36,27.30 1 0 +github.com/muety/wakapi/middlewares/security.go:27.30,29.4 1 0 +github.com/muety/wakapi/middlewares/sentry.go:15.60,16.43 1 0 +github.com/muety/wakapi/middlewares/sentry.go:16.43,20.3 1 0 +github.com/muety/wakapi/middlewares/sentry.go:23.78,26.54 3 0 +github.com/muety/wakapi/middlewares/sentry.go:26.54,27.43 1 0 +github.com/muety/wakapi/middlewares/sentry.go:27.43,29.4 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:30.91,36.2 1 1 +github.com/muety/wakapi/middlewares/authenticate.go:38.90,41.2 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:43.90,46.2 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:48.71,49.71 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:49.71,51.3 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:54.107,58.16 3 0 +github.com/muety/wakapi/middlewares/authenticate.go:61.2,61.16 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:65.2,65.31 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:81.2,82.12 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:58.16,60.3 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:61.16,63.3 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:65.31,66.31 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:71.3,71.29 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:78.3,78.9 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:66.31,69.4 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:71.29,74.4 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:74.9,77.4 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:85.70,86.39 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:91.2,91.14 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:86.39,87.60 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:87.60,89.4 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:94.98,96.16 2 1 +github.com/muety/wakapi/middlewares/authenticate.go:100.2,103.16 4 1 +github.com/muety/wakapi/middlewares/authenticate.go:106.2,106.18 1 1 +github.com/muety/wakapi/middlewares/authenticate.go:96.16,98.3 1 1 +github.com/muety/wakapi/middlewares/authenticate.go:103.16,105.3 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:109.97,113.19 4 1 +github.com/muety/wakapi/middlewares/authenticate.go:116.2,117.16 2 1 +github.com/muety/wakapi/middlewares/authenticate.go:120.2,120.18 1 1 +github.com/muety/wakapi/middlewares/authenticate.go:113.19,115.3 1 1 +github.com/muety/wakapi/middlewares/authenticate.go:117.16,119.3 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:123.92,125.16 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:129.2,130.16 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:137.2,137.18 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:125.16,127.3 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:130.16,132.3 1 0 +github.com/muety/wakapi/middlewares/filetype.go:13.83,14.43 1 0 +github.com/muety/wakapi/middlewares/filetype.go:14.43,19.3 1 0 +github.com/muety/wakapi/middlewares/filetype.go:22.84,24.34 2 0 +github.com/muety/wakapi/middlewares/filetype.go:31.2,31.27 1 0 +github.com/muety/wakapi/middlewares/filetype.go:24.34,25.50 1 0 +github.com/muety/wakapi/middlewares/filetype.go:25.50,29.4 3 0 +github.com/muety/wakapi/middlewares/logging.go:20.102,21.43 1 0 +github.com/muety/wakapi/middlewares/logging.go:21.43,27.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:30.80,39.44 7 0 +github.com/muety/wakapi/middlewares/logging.go:45.2,54.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:39.44,40.38 1 0 +github.com/muety/wakapi/middlewares/logging.go:40.38,42.4 1 0 +github.com/muety/wakapi/middlewares/logging.go:57.41,59.14 2 0 +github.com/muety/wakapi/middlewares/logging.go:62.2,62.14 1 0 +github.com/muety/wakapi/middlewares/logging.go:65.2,65.11 1 0 +github.com/muety/wakapi/middlewares/logging.go:59.14,61.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:62.14,64.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:68.41,69.42 1 0 +github.com/muety/wakapi/middlewares/logging.go:72.2,72.12 1 0 +github.com/muety/wakapi/middlewares/logging.go:69.42,71.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:103.52,105.2 1 0 +github.com/muety/wakapi/middlewares/logging.go:117.45,118.20 1 0 +github.com/muety/wakapi/middlewares/logging.go:118.20,122.3 3 0 +github.com/muety/wakapi/middlewares/logging.go:124.54,127.18 3 0 +github.com/muety/wakapi/middlewares/logging.go:134.2,135.15 2 0 +github.com/muety/wakapi/middlewares/logging.go:127.18,130.17 2 0 +github.com/muety/wakapi/middlewares/logging.go:130.17,132.4 1 0 +github.com/muety/wakapi/middlewares/logging.go:137.42,138.20 1 0 +github.com/muety/wakapi/middlewares/logging.go:138.20,140.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:142.36,144.2 1 0 +github.com/muety/wakapi/middlewares/logging.go:145.42,147.2 1 0 +github.com/muety/wakapi/middlewares/logging.go:148.40,150.2 1 0 +github.com/muety/wakapi/middlewares/logging.go:151.52,153.2 1 0 +github.com/muety/wakapi/config/db.go:39.50,40.19 1 0 +github.com/muety/wakapi/config/db.go:53.2,53.12 1 0 +github.com/muety/wakapi/config/db.go:41.23,45.5 1 0 +github.com/muety/wakapi/config/db.go:46.26,49.5 1 0 +github.com/muety/wakapi/config/db.go:50.24,51.48 1 0 +github.com/muety/wakapi/config/db.go:56.53,66.2 1 1 +github.com/muety/wakapi/config/db.go:68.56,70.16 2 1 +github.com/muety/wakapi/config/db.go:74.2,81.3 1 1 +github.com/muety/wakapi/config/db.go:70.16,72.3 1 0 +github.com/muety/wakapi/config/db.go:84.54,86.2 1 1 +github.com/muety/wakapi/config/eventbus.go:26.13,28.2 1 1 +github.com/muety/wakapi/config/eventbus.go:30.26,32.2 1 0 +github.com/muety/wakapi/config/fs.go:9.56,10.19 1 0 +github.com/muety/wakapi/config/fs.go:13.2,13.19 1 0 +github.com/muety/wakapi/config/fs.go:10.19,12.3 1 0 +github.com/muety/wakapi/config/sentry.go:22.35,24.2 1 0 +github.com/muety/wakapi/config/sentry.go:26.62,29.2 2 0 +github.com/muety/wakapi/config/sentry.go:39.33,46.2 2 0 +github.com/muety/wakapi/config/sentry.go:48.79,51.2 2 0 +github.com/muety/wakapi/config/sentry.go:53.72,57.2 3 0 +github.com/muety/wakapi/config/sentry.go:59.71,63.2 3 0 +github.com/muety/wakapi/config/sentry.go:65.71,69.2 3 0 +github.com/muety/wakapi/config/sentry.go:71.72,75.2 3 0 +github.com/muety/wakapi/config/sentry.go:77.72,81.2 3 0 +github.com/muety/wakapi/config/sentry.go:83.67,88.18 4 0 +github.com/muety/wakapi/config/sentry.go:100.2,100.28 1 0 +github.com/muety/wakapi/config/sentry.go:88.18,89.65 1 0 +github.com/muety/wakapi/config/sentry.go:89.65,92.42 3 0 +github.com/muety/wakapi/config/sentry.go:95.4,96.10 2 0 +github.com/muety/wakapi/config/sentry.go:92.42,94.5 1 0 +github.com/muety/wakapi/config/sentry.go:110.50,114.91 1 0 +github.com/muety/wakapi/config/sentry.go:114.91,115.29 1 0 +github.com/muety/wakapi/config/sentry.go:119.4,122.38 3 0 +github.com/muety/wakapi/config/sentry.go:127.4,127.39 1 0 +github.com/muety/wakapi/config/sentry.go:130.4,130.69 1 0 +github.com/muety/wakapi/config/sentry.go:115.29,117.5 1 0 +github.com/muety/wakapi/config/sentry.go:122.38,123.38 1 0 +github.com/muety/wakapi/config/sentry.go:123.38,125.6 1 0 +github.com/muety/wakapi/config/sentry.go:127.39,129.5 1 0 +github.com/muety/wakapi/config/sentry.go:132.79,133.27 1 0 +github.com/muety/wakapi/config/sentry.go:140.4,140.16 1 0 +github.com/muety/wakapi/config/sentry.go:133.27,134.84 1 0 +github.com/muety/wakapi/config/sentry.go:134.84,135.42 1 0 +github.com/muety/wakapi/config/sentry.go:135.42,137.7 1 0 +github.com/muety/wakapi/config/sentry.go:142.17,144.3 1 0 +github.com/muety/wakapi/config/sentry.go:147.49,151.51 2 0 +github.com/muety/wakapi/config/sentry.go:154.2,154.12 1 0 +github.com/muety/wakapi/config/sentry.go:151.51,153.3 1 0 +github.com/muety/wakapi/config/utils.go:5.78,7.22 2 0 +github.com/muety/wakapi/config/utils.go:13.2,13.11 1 0 +github.com/muety/wakapi/config/utils.go:7.22,8.18 1 0 +github.com/muety/wakapi/config/utils.go:11.3,11.12 1 0 +github.com/muety/wakapi/config/utils.go:8.18,10.4 1 0 github.com/muety/wakapi/config/config.go:154.70,156.2 1 0 github.com/muety/wakapi/config/config.go:158.65,160.2 1 0 github.com/muety/wakapi/config/config.go:162.82,172.2 1 0 @@ -511,239 +512,170 @@ github.com/muety/wakapi/config/config.go:387.51,390.3 2 0 github.com/muety/wakapi/config/config.go:391.94,393.3 1 0 github.com/muety/wakapi/config/config.go:394.81,396.3 1 0 github.com/muety/wakapi/config/config.go:397.75,399.3 1 0 -github.com/muety/wakapi/config/db.go:39.50,40.19 1 0 -github.com/muety/wakapi/config/db.go:53.2,53.12 1 0 -github.com/muety/wakapi/config/db.go:41.23,45.5 1 0 -github.com/muety/wakapi/config/db.go:46.26,49.5 1 0 -github.com/muety/wakapi/config/db.go:50.24,51.48 1 0 -github.com/muety/wakapi/config/db.go:56.53,66.2 1 1 -github.com/muety/wakapi/config/db.go:68.56,70.16 2 1 -github.com/muety/wakapi/config/db.go:74.2,81.3 1 1 -github.com/muety/wakapi/config/db.go:70.16,72.3 1 0 -github.com/muety/wakapi/config/db.go:84.54,86.2 1 1 -github.com/muety/wakapi/config/eventbus.go:26.13,28.2 1 1 -github.com/muety/wakapi/config/eventbus.go:30.26,32.2 1 0 -github.com/muety/wakapi/config/fs.go:9.56,10.19 1 0 -github.com/muety/wakapi/config/fs.go:13.2,13.19 1 0 -github.com/muety/wakapi/config/fs.go:10.19,12.3 1 0 -github.com/muety/wakapi/config/sentry.go:22.35,24.2 1 0 -github.com/muety/wakapi/config/sentry.go:26.62,29.2 2 0 -github.com/muety/wakapi/config/sentry.go:39.33,46.2 2 0 -github.com/muety/wakapi/config/sentry.go:48.79,51.2 2 0 -github.com/muety/wakapi/config/sentry.go:53.72,57.2 3 0 -github.com/muety/wakapi/config/sentry.go:59.71,63.2 3 0 -github.com/muety/wakapi/config/sentry.go:65.71,69.2 3 0 -github.com/muety/wakapi/config/sentry.go:71.72,75.2 3 0 -github.com/muety/wakapi/config/sentry.go:77.72,81.2 3 0 -github.com/muety/wakapi/config/sentry.go:83.67,88.18 4 0 -github.com/muety/wakapi/config/sentry.go:100.2,100.28 1 0 -github.com/muety/wakapi/config/sentry.go:88.18,89.65 1 0 -github.com/muety/wakapi/config/sentry.go:89.65,92.42 3 0 -github.com/muety/wakapi/config/sentry.go:95.4,96.10 2 0 -github.com/muety/wakapi/config/sentry.go:92.42,94.5 1 0 -github.com/muety/wakapi/config/sentry.go:110.50,114.91 1 0 -github.com/muety/wakapi/config/sentry.go:114.91,115.29 1 0 -github.com/muety/wakapi/config/sentry.go:119.4,122.38 3 0 -github.com/muety/wakapi/config/sentry.go:127.4,127.39 1 0 -github.com/muety/wakapi/config/sentry.go:130.4,130.69 1 0 -github.com/muety/wakapi/config/sentry.go:115.29,117.5 1 0 -github.com/muety/wakapi/config/sentry.go:122.38,123.38 1 0 -github.com/muety/wakapi/config/sentry.go:123.38,125.6 1 0 -github.com/muety/wakapi/config/sentry.go:127.39,129.5 1 0 -github.com/muety/wakapi/config/sentry.go:132.79,133.27 1 0 -github.com/muety/wakapi/config/sentry.go:140.4,140.16 1 0 -github.com/muety/wakapi/config/sentry.go:133.27,134.84 1 0 -github.com/muety/wakapi/config/sentry.go:134.84,135.42 1 0 -github.com/muety/wakapi/config/sentry.go:135.42,137.7 1 0 -github.com/muety/wakapi/config/sentry.go:142.17,144.3 1 0 -github.com/muety/wakapi/config/sentry.go:147.49,151.51 2 0 -github.com/muety/wakapi/config/sentry.go:154.2,154.12 1 0 -github.com/muety/wakapi/config/sentry.go:151.51,153.3 1 0 -github.com/muety/wakapi/config/utils.go:5.78,7.22 2 0 -github.com/muety/wakapi/config/utils.go:13.2,13.11 1 0 -github.com/muety/wakapi/config/utils.go:7.22,8.18 1 0 -github.com/muety/wakapi/config/utils.go:11.3,11.12 1 0 -github.com/muety/wakapi/config/utils.go:8.18,10.4 1 0 -github.com/muety/wakapi/middlewares/security.go:19.62,20.43 1 0 -github.com/muety/wakapi/middlewares/security.go:20.43,22.3 1 0 -github.com/muety/wakapi/middlewares/security.go:25.80,26.36 1 0 -github.com/muety/wakapi/middlewares/security.go:31.2,31.27 1 0 -github.com/muety/wakapi/middlewares/security.go:26.36,27.30 1 0 -github.com/muety/wakapi/middlewares/security.go:27.30,29.4 1 0 -github.com/muety/wakapi/middlewares/sentry.go:15.60,16.43 1 0 -github.com/muety/wakapi/middlewares/sentry.go:16.43,20.3 1 0 -github.com/muety/wakapi/middlewares/sentry.go:23.78,26.54 3 0 -github.com/muety/wakapi/middlewares/sentry.go:26.54,27.43 1 0 -github.com/muety/wakapi/middlewares/sentry.go:27.43,29.4 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:30.91,36.2 1 1 -github.com/muety/wakapi/middlewares/authenticate.go:38.90,41.2 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:43.90,46.2 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:48.71,49.71 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:49.71,51.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:54.107,58.16 3 0 -github.com/muety/wakapi/middlewares/authenticate.go:61.2,61.16 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:65.2,65.31 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:81.2,82.12 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:58.16,60.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:61.16,63.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:65.31,66.31 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:71.3,71.29 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:78.3,78.9 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:66.31,69.4 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:71.29,74.4 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:74.9,77.4 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:85.70,86.39 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:91.2,91.14 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:86.39,87.60 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:87.60,89.4 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:94.98,96.16 2 1 -github.com/muety/wakapi/middlewares/authenticate.go:100.2,103.16 4 1 -github.com/muety/wakapi/middlewares/authenticate.go:106.2,106.18 1 1 -github.com/muety/wakapi/middlewares/authenticate.go:96.16,98.3 1 1 -github.com/muety/wakapi/middlewares/authenticate.go:103.16,105.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:109.97,113.19 4 1 -github.com/muety/wakapi/middlewares/authenticate.go:116.2,117.16 2 1 -github.com/muety/wakapi/middlewares/authenticate.go:120.2,120.18 1 1 -github.com/muety/wakapi/middlewares/authenticate.go:113.19,115.3 1 1 -github.com/muety/wakapi/middlewares/authenticate.go:117.16,119.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:123.92,125.16 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:129.2,130.16 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:137.2,137.18 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:125.16,127.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:130.16,132.3 1 0 -github.com/muety/wakapi/middlewares/filetype.go:13.83,14.43 1 0 -github.com/muety/wakapi/middlewares/filetype.go:14.43,19.3 1 0 -github.com/muety/wakapi/middlewares/filetype.go:22.84,24.34 2 0 -github.com/muety/wakapi/middlewares/filetype.go:31.2,31.27 1 0 -github.com/muety/wakapi/middlewares/filetype.go:24.34,25.50 1 0 -github.com/muety/wakapi/middlewares/filetype.go:25.50,29.4 3 0 -github.com/muety/wakapi/middlewares/logging.go:20.102,21.43 1 0 -github.com/muety/wakapi/middlewares/logging.go:21.43,27.3 1 0 -github.com/muety/wakapi/middlewares/logging.go:30.80,39.44 7 0 -github.com/muety/wakapi/middlewares/logging.go:45.2,54.3 1 0 -github.com/muety/wakapi/middlewares/logging.go:39.44,40.38 1 0 -github.com/muety/wakapi/middlewares/logging.go:40.38,42.4 1 0 -github.com/muety/wakapi/middlewares/logging.go:57.41,59.14 2 0 -github.com/muety/wakapi/middlewares/logging.go:62.2,62.14 1 0 -github.com/muety/wakapi/middlewares/logging.go:65.2,65.11 1 0 -github.com/muety/wakapi/middlewares/logging.go:59.14,61.3 1 0 -github.com/muety/wakapi/middlewares/logging.go:62.14,64.3 1 0 -github.com/muety/wakapi/middlewares/logging.go:68.41,69.42 1 0 -github.com/muety/wakapi/middlewares/logging.go:72.2,72.12 1 0 -github.com/muety/wakapi/middlewares/logging.go:69.42,71.3 1 0 -github.com/muety/wakapi/middlewares/logging.go:103.52,105.2 1 0 -github.com/muety/wakapi/middlewares/logging.go:117.45,118.20 1 0 -github.com/muety/wakapi/middlewares/logging.go:118.20,122.3 3 0 -github.com/muety/wakapi/middlewares/logging.go:124.54,127.18 3 0 -github.com/muety/wakapi/middlewares/logging.go:134.2,135.15 2 0 -github.com/muety/wakapi/middlewares/logging.go:127.18,130.17 2 0 -github.com/muety/wakapi/middlewares/logging.go:130.17,132.4 1 0 -github.com/muety/wakapi/middlewares/logging.go:137.42,138.20 1 0 -github.com/muety/wakapi/middlewares/logging.go:138.20,140.3 1 0 -github.com/muety/wakapi/middlewares/logging.go:142.36,144.2 1 0 -github.com/muety/wakapi/middlewares/logging.go:145.42,147.2 1 0 -github.com/muety/wakapi/middlewares/logging.go:148.40,150.2 1 0 -github.com/muety/wakapi/middlewares/logging.go:151.52,153.2 1 0 -github.com/muety/wakapi/middlewares/principal.go:15.62,17.2 1 0 -github.com/muety/wakapi/middlewares/principal.go:19.58,21.2 1 0 -github.com/muety/wakapi/middlewares/principal.go:42.71,43.43 1 0 -github.com/muety/wakapi/middlewares/principal.go:43.43,45.3 1 0 -github.com/muety/wakapi/middlewares/principal.go:48.81,51.2 2 0 -github.com/muety/wakapi/middlewares/principal.go:53.55,54.52 1 0 -github.com/muety/wakapi/middlewares/principal.go:54.52,56.3 1 0 -github.com/muety/wakapi/middlewares/principal.go:59.49,60.52 1 0 -github.com/muety/wakapi/middlewares/principal.go:63.2,63.12 1 0 -github.com/muety/wakapi/middlewares/principal.go:60.52,62.3 1 0 -github.com/muety/wakapi/services/user.go:24.99,34.33 3 0 -github.com/muety/wakapi/services/user.go:55.2,55.12 1 0 -github.com/muety/wakapi/services/user.go:34.33,35.31 1 0 -github.com/muety/wakapi/services/user.go:35.31,41.61 4 0 -github.com/muety/wakapi/services/user.go:45.4,45.24 1 0 -github.com/muety/wakapi/services/user.go:41.61,43.5 1 0 -github.com/muety/wakapi/services/user.go:45.24,46.80 1 0 -github.com/muety/wakapi/services/user.go:46.80,48.6 1 0 -github.com/muety/wakapi/services/user.go:48.11,50.6 1 0 -github.com/muety/wakapi/services/user.go:58.74,59.40 1 0 -github.com/muety/wakapi/services/user.go:63.2,64.16 2 0 -github.com/muety/wakapi/services/user.go:68.2,69.15 2 0 -github.com/muety/wakapi/services/user.go:59.40,61.3 1 0 -github.com/muety/wakapi/services/user.go:64.16,66.3 1 0 -github.com/muety/wakapi/services/user.go:72.72,73.37 1 0 -github.com/muety/wakapi/services/user.go:77.2,78.16 2 0 -github.com/muety/wakapi/services/user.go:82.2,83.15 2 0 -github.com/muety/wakapi/services/user.go:73.37,75.3 1 0 -github.com/muety/wakapi/services/user.go:78.16,80.3 1 0 -github.com/muety/wakapi/services/user.go:86.76,88.2 1 0 -github.com/muety/wakapi/services/user.go:90.86,92.2 1 0 -github.com/muety/wakapi/services/user.go:94.58,96.2 1 0 -github.com/muety/wakapi/services/user.go:98.86,100.2 1 0 -github.com/muety/wakapi/services/user.go:102.71,104.12 2 0 -github.com/muety/wakapi/services/user.go:108.2,109.42 2 0 -github.com/muety/wakapi/services/user.go:113.2,114.16 2 0 -github.com/muety/wakapi/services/user.go:118.2,119.21 2 0 -github.com/muety/wakapi/services/user.go:104.12,106.3 1 0 -github.com/muety/wakapi/services/user.go:109.42,111.3 1 0 -github.com/muety/wakapi/services/user.go:114.16,116.3 1 0 -github.com/muety/wakapi/services/user.go:122.48,124.2 1 0 -github.com/muety/wakapi/services/user.go:126.102,136.93 2 0 -github.com/muety/wakapi/services/user.go:142.2,142.38 1 0 -github.com/muety/wakapi/services/user.go:136.93,138.3 1 0 -github.com/muety/wakapi/services/user.go:138.8,140.3 1 0 -github.com/muety/wakapi/services/user.go:145.73,149.2 3 0 -github.com/muety/wakapi/services/user.go:151.78,155.2 3 0 -github.com/muety/wakapi/services/user.go:157.99,160.2 2 0 -github.com/muety/wakapi/services/user.go:162.106,165.96 3 0 -github.com/muety/wakapi/services/user.go:170.2,170.68 1 0 -github.com/muety/wakapi/services/user.go:165.96,167.3 1 0 -github.com/muety/wakapi/services/user.go:167.8,169.3 1 0 -github.com/muety/wakapi/services/user.go:173.85,175.2 1 0 -github.com/muety/wakapi/services/user.go:177.57,184.2 4 0 -github.com/muety/wakapi/services/user.go:186.38,188.2 1 0 -github.com/muety/wakapi/services/user.go:190.57,195.2 1 0 -github.com/muety/wakapi/services/alias.go:18.77,23.2 1 1 -github.com/muety/wakapi/services/alias.go:27.60,28.43 1 1 -github.com/muety/wakapi/services/alias.go:31.2,31.14 1 1 -github.com/muety/wakapi/services/alias.go:28.43,30.3 1 1 -github.com/muety/wakapi/services/alias.go:34.62,36.16 2 1 -github.com/muety/wakapi/services/alias.go:39.2,39.12 1 1 -github.com/muety/wakapi/services/alias.go:36.16,38.3 1 1 -github.com/muety/wakapi/services/alias.go:42.59,43.51 1 1 -github.com/muety/wakapi/services/alias.go:43.51,45.3 1 0 -github.com/muety/wakapi/services/alias.go:48.76,49.32 1 0 -github.com/muety/wakapi/services/alias.go:52.2,52.49 1 0 -github.com/muety/wakapi/services/alias.go:49.32,51.3 1 0 -github.com/muety/wakapi/services/alias.go:52.49,54.3 1 0 -github.com/muety/wakapi/services/alias.go:54.8,56.3 1 0 -github.com/muety/wakapi/services/alias.go:59.113,60.32 1 0 -github.com/muety/wakapi/services/alias.go:63.2,63.49 1 0 -github.com/muety/wakapi/services/alias.go:60.32,62.3 1 0 -github.com/muety/wakapi/services/alias.go:63.49,65.47 2 0 -github.com/muety/wakapi/services/alias.go:70.3,70.30 1 0 -github.com/muety/wakapi/services/alias.go:65.47,66.45 1 0 -github.com/muety/wakapi/services/alias.go:66.45,68.5 1 0 -github.com/muety/wakapi/services/alias.go:71.8,73.3 1 0 -github.com/muety/wakapi/services/alias.go:76.108,77.32 1 1 -github.com/muety/wakapi/services/alias.go:81.2,81.49 1 1 -github.com/muety/wakapi/services/alias.go:89.2,89.19 1 1 -github.com/muety/wakapi/services/alias.go:77.32,79.3 1 1 -github.com/muety/wakapi/services/alias.go:81.49,82.47 1 1 -github.com/muety/wakapi/services/alias.go:82.47,83.49 1 1 -github.com/muety/wakapi/services/alias.go:83.49,85.5 1 1 -github.com/muety/wakapi/services/alias.go:92.77,94.16 2 0 -github.com/muety/wakapi/services/alias.go:97.2,98.20 2 0 -github.com/muety/wakapi/services/alias.go:94.16,96.3 1 0 -github.com/muety/wakapi/services/alias.go:101.60,102.24 1 0 -github.com/muety/wakapi/services/alias.go:105.2,107.12 3 0 -github.com/muety/wakapi/services/alias.go:102.24,104.3 1 0 -github.com/muety/wakapi/services/alias.go:110.69,113.28 3 0 -github.com/muety/wakapi/services/alias.go:121.2,123.31 2 0 -github.com/muety/wakapi/services/alias.go:127.2,127.12 1 0 -github.com/muety/wakapi/services/alias.go:113.28,114.21 1 0 -github.com/muety/wakapi/services/alias.go:117.3,118.16 2 0 -github.com/muety/wakapi/services/alias.go:114.21,116.4 1 0 -github.com/muety/wakapi/services/alias.go:123.31,125.3 1 0 -github.com/muety/wakapi/services/diagnostics.go:14.101,19.2 1 0 -github.com/muety/wakapi/services/diagnostics.go:21.101,23.2 1 0 +github.com/muety/wakapi/utils/common.go:18.73,19.58 1 0 +github.com/muety/wakapi/utils/common.go:22.2,22.87 1 0 +github.com/muety/wakapi/utils/common.go:25.2,25.64 1 0 +github.com/muety/wakapi/utils/common.go:19.58,21.3 1 0 +github.com/muety/wakapi/utils/common.go:22.87,24.3 1 0 +github.com/muety/wakapi/utils/common.go:28.40,30.2 1 0 +github.com/muety/wakapi/utils/common.go:32.44,34.2 1 0 +github.com/muety/wakapi/utils/common.go:36.49,38.2 1 0 +github.com/muety/wakapi/utils/common.go:40.45,42.2 1 0 +github.com/muety/wakapi/utils/common.go:44.24,46.2 1 0 +github.com/muety/wakapi/utils/common.go:48.56,51.45 3 1 +github.com/muety/wakapi/utils/common.go:54.2,54.40 1 1 +github.com/muety/wakapi/utils/common.go:51.45,53.3 1 1 +github.com/muety/wakapi/utils/date.go:8.43,10.2 1 1 +github.com/muety/wakapi/utils/date.go:12.48,14.2 1 0 +github.com/muety/wakapi/utils/date.go:16.41,18.21 2 1 +github.com/muety/wakapi/utils/date.go:21.2,21.23 1 1 +github.com/muety/wakapi/utils/date.go:18.21,20.3 1 0 +github.com/muety/wakapi/utils/date.go:24.46,26.2 1 0 +github.com/muety/wakapi/utils/date.go:28.51,30.2 1 0 +github.com/muety/wakapi/utils/date.go:32.44,35.2 2 1 +github.com/muety/wakapi/utils/date.go:37.52,39.2 1 0 +github.com/muety/wakapi/utils/date.go:41.45,43.2 1 0 +github.com/muety/wakapi/utils/date.go:45.51,47.2 1 0 +github.com/muety/wakapi/utils/date.go:49.44,51.2 1 0 +github.com/muety/wakapi/utils/date.go:54.42,56.2 1 1 +github.com/muety/wakapi/utils/date.go:59.46,61.2 1 0 +github.com/muety/wakapi/utils/date.go:64.41,66.21 2 1 +github.com/muety/wakapi/utils/date.go:69.2,69.33 1 1 +github.com/muety/wakapi/utils/date.go:66.21,68.3 1 1 +github.com/muety/wakapi/utils/date.go:73.63,75.2 1 0 +github.com/muety/wakapi/utils/date.go:78.62,84.2 5 0 +github.com/muety/wakapi/utils/date.go:87.67,90.33 2 1 +github.com/muety/wakapi/utils/date.go:99.2,99.18 1 1 +github.com/muety/wakapi/utils/date.go:90.33,92.19 2 1 +github.com/muety/wakapi/utils/date.go:95.3,96.10 2 1 +github.com/muety/wakapi/utils/date.go:92.19,94.4 1 1 +github.com/muety/wakapi/utils/date.go:102.50,108.2 5 0 +github.com/muety/wakapi/utils/date.go:111.79,114.36 3 1 +github.com/muety/wakapi/utils/date.go:118.2,118.21 1 1 +github.com/muety/wakapi/utils/date.go:122.2,122.21 1 1 +github.com/muety/wakapi/utils/date.go:126.2,126.13 1 1 +github.com/muety/wakapi/utils/date.go:114.36,117.3 2 0 +github.com/muety/wakapi/utils/date.go:118.21,121.3 2 1 +github.com/muety/wakapi/utils/date.go:122.21,125.3 2 1 +github.com/muety/wakapi/utils/summary.go:10.66,11.40 1 0 +github.com/muety/wakapi/utils/summary.go:16.2,16.48 1 0 +github.com/muety/wakapi/utils/summary.go:11.40,12.27 1 0 +github.com/muety/wakapi/utils/summary.go:12.27,14.4 1 0 +github.com/muety/wakapi/utils/summary.go:19.88,22.2 2 0 +github.com/muety/wakapi/utils/summary.go:24.95,26.16 2 0 +github.com/muety/wakapi/utils/summary.go:29.2,29.38 1 0 +github.com/muety/wakapi/utils/summary.go:26.16,28.3 1 0 +github.com/muety/wakapi/utils/summary.go:32.105,36.18 3 0 +github.com/muety/wakapi/utils/summary.go:71.2,71.22 1 0 +github.com/muety/wakapi/utils/summary.go:37.28,38.26 1 0 +github.com/muety/wakapi/utils/summary.go:39.32,41.24 2 0 +github.com/muety/wakapi/utils/summary.go:42.31,43.29 1 0 +github.com/muety/wakapi/utils/summary.go:44.31,46.27 2 0 +github.com/muety/wakapi/utils/summary.go:47.32,48.30 1 0 +github.com/muety/wakapi/utils/summary.go:49.32,51.28 2 0 +github.com/muety/wakapi/utils/summary.go:52.31,53.29 1 0 +github.com/muety/wakapi/utils/summary.go:54.32,55.31 1 0 +github.com/muety/wakapi/utils/summary.go:56.41,58.42 2 0 +github.com/muety/wakapi/utils/summary.go:59.33,60.32 1 0 +github.com/muety/wakapi/utils/summary.go:61.33,62.32 1 0 +github.com/muety/wakapi/utils/summary.go:63.35,64.32 1 0 +github.com/muety/wakapi/utils/summary.go:65.26,66.21 1 0 +github.com/muety/wakapi/utils/summary.go:67.10,68.39 1 0 +github.com/muety/wakapi/utils/summary.go:74.73,81.56 5 0 +github.com/muety/wakapi/utils/summary.go:97.2,107.8 3 0 +github.com/muety/wakapi/utils/summary.go:81.56,83.3 1 0 +github.com/muety/wakapi/utils/summary.go:83.8,83.54 1 0 +github.com/muety/wakapi/utils/summary.go:83.54,85.3 1 0 +github.com/muety/wakapi/utils/summary.go:85.8,87.17 2 0 +github.com/muety/wakapi/utils/summary.go:91.3,92.17 2 0 +github.com/muety/wakapi/utils/summary.go:87.17,89.4 1 0 +github.com/muety/wakapi/utils/summary.go:92.17,94.4 1 0 +github.com/muety/wakapi/utils/summary.go:110.59,112.48 2 0 +github.com/muety/wakapi/utils/summary.go:115.2,115.49 1 0 +github.com/muety/wakapi/utils/summary.go:118.2,118.47 1 0 +github.com/muety/wakapi/utils/summary.go:121.2,121.48 1 0 +github.com/muety/wakapi/utils/summary.go:124.2,124.57 1 0 +github.com/muety/wakapi/utils/summary.go:127.2,127.46 1 0 +github.com/muety/wakapi/utils/summary.go:130.2,130.47 1 0 +github.com/muety/wakapi/utils/summary.go:133.2,133.16 1 0 +github.com/muety/wakapi/utils/summary.go:112.48,114.3 1 0 +github.com/muety/wakapi/utils/summary.go:115.49,117.3 1 0 +github.com/muety/wakapi/utils/summary.go:118.47,120.3 1 0 +github.com/muety/wakapi/utils/summary.go:121.48,123.3 1 0 +github.com/muety/wakapi/utils/summary.go:124.57,126.3 1 0 +github.com/muety/wakapi/utils/summary.go:127.46,129.3 1 0 +github.com/muety/wakapi/utils/summary.go:130.47,132.3 1 0 +github.com/muety/wakapi/utils/summary.go:136.48,140.51 2 0 +github.com/muety/wakapi/utils/summary.go:143.2,143.12 1 0 +github.com/muety/wakapi/utils/summary.go:140.51,142.3 1 0 +github.com/muety/wakapi/utils/template.go:13.41,15.16 2 0 +github.com/muety/wakapi/utils/template.go:18.2,18.23 1 0 +github.com/muety/wakapi/utils/template.go:15.16,17.3 1 0 +github.com/muety/wakapi/utils/template.go:21.37,22.30 1 0 +github.com/muety/wakapi/utils/template.go:25.2,25.10 1 0 +github.com/muety/wakapi/utils/template.go:22.30,24.3 1 0 +github.com/muety/wakapi/utils/template.go:28.83,33.16 4 0 +github.com/muety/wakapi/utils/template.go:37.2,37.29 1 0 +github.com/muety/wakapi/utils/template.go:62.2,62.23 1 0 +github.com/muety/wakapi/utils/template.go:33.16,35.3 1 0 +github.com/muety/wakapi/utils/template.go:37.29,39.51 2 0 +github.com/muety/wakapi/utils/template.go:43.3,44.17 2 0 +github.com/muety/wakapi/utils/template.go:47.3,48.17 2 0 +github.com/muety/wakapi/utils/template.go:52.3,55.17 3 0 +github.com/muety/wakapi/utils/template.go:59.3,59.27 1 0 +github.com/muety/wakapi/utils/template.go:39.51,40.12 1 0 +github.com/muety/wakapi/utils/template.go:44.17,46.4 1 0 +github.com/muety/wakapi/utils/template.go:48.17,50.4 1 0 +github.com/muety/wakapi/utils/template.go:55.17,57.4 1 0 +github.com/muety/wakapi/utils/color.go:8.90,10.32 2 0 +github.com/muety/wakapi/utils/color.go:15.2,15.15 1 0 +github.com/muety/wakapi/utils/color.go:10.32,11.50 1 0 +github.com/muety/wakapi/utils/color.go:11.50,13.4 1 0 +github.com/muety/wakapi/utils/collection.go:3.59,5.22 2 0 +github.com/muety/wakapi/utils/collection.go:8.2,8.15 1 0 +github.com/muety/wakapi/utils/collection.go:5.22,7.3 1 0 +github.com/muety/wakapi/utils/db.go:8.34,9.37 1 0 +github.com/muety/wakapi/utils/db.go:17.2,18.14 2 0 +github.com/muety/wakapi/utils/db.go:9.37,11.110 2 0 +github.com/muety/wakapi/utils/db.go:15.3,15.20 1 0 +github.com/muety/wakapi/utils/db.go:11.110,14.4 2 0 +github.com/muety/wakapi/utils/db.go:21.39,22.37 1 0 +github.com/muety/wakapi/utils/db.go:30.2,31.14 2 0 +github.com/muety/wakapi/utils/db.go:22.37,24.119 2 0 +github.com/muety/wakapi/utils/db.go:28.3,28.20 1 0 +github.com/muety/wakapi/utils/db.go:24.119,27.4 2 0 +github.com/muety/wakapi/utils/http.go:9.90,12.58 3 0 +github.com/muety/wakapi/utils/http.go:12.58,14.3 1 0 +github.com/muety/wakapi/utils/set.go:3.51,5.26 2 0 +github.com/muety/wakapi/utils/set.go:8.2,8.12 1 0 +github.com/muety/wakapi/utils/set.go:5.26,7.3 1 0 +github.com/muety/wakapi/utils/set.go:11.49,13.21 2 0 +github.com/muety/wakapi/utils/set.go:16.2,16.14 1 0 +github.com/muety/wakapi/utils/set.go:13.21,15.3 1 0 +github.com/muety/wakapi/utils/strings.go:8.34,10.2 1 0 +github.com/muety/wakapi/utils/strings.go:12.77,13.29 1 0 +github.com/muety/wakapi/utils/strings.go:18.2,18.19 1 0 +github.com/muety/wakapi/utils/strings.go:13.29,14.18 1 0 +github.com/muety/wakapi/utils/strings.go:14.18,16.4 1 0 +github.com/muety/wakapi/utils/auth.go:16.79,18.54 2 0 +github.com/muety/wakapi/utils/auth.go:22.2,24.16 3 0 +github.com/muety/wakapi/utils/auth.go:28.2,30.45 3 0 +github.com/muety/wakapi/utils/auth.go:33.2,34.32 2 0 +github.com/muety/wakapi/utils/auth.go:18.54,20.3 1 0 +github.com/muety/wakapi/utils/auth.go:24.16,26.3 1 0 +github.com/muety/wakapi/utils/auth.go:30.45,32.3 1 0 +github.com/muety/wakapi/utils/auth.go:37.65,39.85 2 0 +github.com/muety/wakapi/utils/auth.go:43.2,44.30 2 0 +github.com/muety/wakapi/utils/auth.go:39.85,41.3 1 0 +github.com/muety/wakapi/utils/auth.go:47.94,49.16 2 0 +github.com/muety/wakapi/utils/auth.go:53.2,53.107 1 0 +github.com/muety/wakapi/utils/auth.go:57.2,57.22 1 0 +github.com/muety/wakapi/utils/auth.go:49.16,51.3 1 0 +github.com/muety/wakapi/utils/auth.go:53.107,55.3 1 0 +github.com/muety/wakapi/utils/auth.go:60.56,64.2 3 0 +github.com/muety/wakapi/utils/auth.go:66.55,69.16 3 0 +github.com/muety/wakapi/utils/auth.go:72.2,72.16 1 0 +github.com/muety/wakapi/utils/auth.go:69.16,71.3 1 0 github.com/muety/wakapi/services/heartbeat.go:26.141,40.33 3 0 github.com/muety/wakapi/services/heartbeat.go:48.2,48.12 1 0 github.com/muety/wakapi/services/heartbeat.go:40.33,41.31 1 0 @@ -861,6 +793,35 @@ github.com/muety/wakapi/services/project_label.go:94.24,96.3 1 0 github.com/muety/wakapi/services/project_label.go:103.89,105.14 2 0 github.com/muety/wakapi/services/project_label.go:108.2,111.4 1 0 github.com/muety/wakapi/services/project_label.go:105.14,107.3 1 0 +github.com/muety/wakapi/services/report.go:30.122,44.33 4 0 +github.com/muety/wakapi/services/report.go:50.2,50.12 1 0 +github.com/muety/wakapi/services/report.go:44.33,45.31 1 0 +github.com/muety/wakapi/services/report.go:45.31,47.4 1 0 +github.com/muety/wakapi/services/report.go:53.38,57.16 3 0 +github.com/muety/wakapi/services/report.go:61.2,62.26 2 0 +github.com/muety/wakapi/services/report.go:57.16,59.3 1 0 +github.com/muety/wakapi/services/report.go:62.26,64.3 1 0 +github.com/muety/wakapi/services/report.go:69.61,74.22 3 0 +github.com/muety/wakapi/services/report.go:81.2,81.65 1 0 +github.com/muety/wakapi/services/report.go:98.2,98.24 1 0 +github.com/muety/wakapi/services/report.go:74.22,78.3 3 0 +github.com/muety/wakapi/services/report.go:81.65,91.47 3 0 +github.com/muety/wakapi/services/report.go:91.47,93.4 1 0 +github.com/muety/wakapi/services/report.go:93.9,95.4 1 0 +github.com/muety/wakapi/services/report.go:101.80,102.22 1 0 +github.com/muety/wakapi/services/report.go:107.2,107.29 1 0 +github.com/muety/wakapi/services/report.go:112.2,116.16 4 0 +github.com/muety/wakapi/services/report.go:121.2,128.65 2 0 +github.com/muety/wakapi/services/report.go:133.2,134.12 2 0 +github.com/muety/wakapi/services/report.go:102.22,105.3 2 0 +github.com/muety/wakapi/services/report.go:107.29,110.3 2 0 +github.com/muety/wakapi/services/report.go:116.16,119.3 2 0 +github.com/muety/wakapi/services/report.go:128.65,131.3 2 0 +github.com/muety/wakapi/services/report.go:137.63,138.41 1 0 +github.com/muety/wakapi/services/report.go:145.2,145.12 1 0 +github.com/muety/wakapi/services/report.go:138.41,139.30 1 0 +github.com/muety/wakapi/services/report.go:139.30,140.16 1 0 +github.com/muety/wakapi/services/report.go:140.16,142.5 1 0 github.com/muety/wakapi/services/summary.go:29.189,41.33 3 1 github.com/muety/wakapi/services/summary.go:52.2,52.12 1 1 github.com/muety/wakapi/services/summary.go:41.33,42.31 1 1 @@ -1038,6 +999,117 @@ github.com/muety/wakapi/services/aggregation.go:176.27,178.3 1 0 github.com/muety/wakapi/services/aggregation.go:181.83,196.41 5 0 github.com/muety/wakapi/services/aggregation.go:196.41,206.3 3 0 github.com/muety/wakapi/services/aggregation.go:209.34,212.2 2 0 +github.com/muety/wakapi/services/diagnostics.go:14.101,19.2 1 0 +github.com/muety/wakapi/services/diagnostics.go:21.101,23.2 1 0 +github.com/muety/wakapi/services/user.go:24.99,34.33 3 0 +github.com/muety/wakapi/services/user.go:55.2,55.12 1 0 +github.com/muety/wakapi/services/user.go:34.33,35.31 1 0 +github.com/muety/wakapi/services/user.go:35.31,41.61 4 0 +github.com/muety/wakapi/services/user.go:45.4,45.24 1 0 +github.com/muety/wakapi/services/user.go:41.61,43.5 1 0 +github.com/muety/wakapi/services/user.go:45.24,46.80 1 0 +github.com/muety/wakapi/services/user.go:46.80,48.6 1 0 +github.com/muety/wakapi/services/user.go:48.11,50.6 1 0 +github.com/muety/wakapi/services/user.go:58.74,59.40 1 0 +github.com/muety/wakapi/services/user.go:63.2,64.16 2 0 +github.com/muety/wakapi/services/user.go:68.2,69.15 2 0 +github.com/muety/wakapi/services/user.go:59.40,61.3 1 0 +github.com/muety/wakapi/services/user.go:64.16,66.3 1 0 +github.com/muety/wakapi/services/user.go:72.72,73.37 1 0 +github.com/muety/wakapi/services/user.go:77.2,78.16 2 0 +github.com/muety/wakapi/services/user.go:82.2,83.15 2 0 +github.com/muety/wakapi/services/user.go:73.37,75.3 1 0 +github.com/muety/wakapi/services/user.go:78.16,80.3 1 0 +github.com/muety/wakapi/services/user.go:86.76,88.2 1 0 +github.com/muety/wakapi/services/user.go:90.86,92.2 1 0 +github.com/muety/wakapi/services/user.go:94.58,96.2 1 0 +github.com/muety/wakapi/services/user.go:98.86,100.2 1 0 +github.com/muety/wakapi/services/user.go:102.71,104.12 2 0 +github.com/muety/wakapi/services/user.go:108.2,109.42 2 0 +github.com/muety/wakapi/services/user.go:113.2,114.16 2 0 +github.com/muety/wakapi/services/user.go:118.2,119.21 2 0 +github.com/muety/wakapi/services/user.go:104.12,106.3 1 0 +github.com/muety/wakapi/services/user.go:109.42,111.3 1 0 +github.com/muety/wakapi/services/user.go:114.16,116.3 1 0 +github.com/muety/wakapi/services/user.go:122.48,124.2 1 0 +github.com/muety/wakapi/services/user.go:126.102,136.93 2 0 +github.com/muety/wakapi/services/user.go:142.2,142.38 1 0 +github.com/muety/wakapi/services/user.go:136.93,138.3 1 0 +github.com/muety/wakapi/services/user.go:138.8,140.3 1 0 +github.com/muety/wakapi/services/user.go:145.73,149.2 3 0 +github.com/muety/wakapi/services/user.go:151.78,155.2 3 0 +github.com/muety/wakapi/services/user.go:157.99,160.2 2 0 +github.com/muety/wakapi/services/user.go:162.106,165.96 3 0 +github.com/muety/wakapi/services/user.go:170.2,170.68 1 0 +github.com/muety/wakapi/services/user.go:165.96,167.3 1 0 +github.com/muety/wakapi/services/user.go:167.8,169.3 1 0 +github.com/muety/wakapi/services/user.go:173.85,175.2 1 0 +github.com/muety/wakapi/services/user.go:177.57,184.2 4 0 +github.com/muety/wakapi/services/user.go:186.38,188.2 1 0 +github.com/muety/wakapi/services/user.go:190.57,195.2 1 0 +github.com/muety/wakapi/services/misc.go:21.126,28.2 1 0 +github.com/muety/wakapi/services/misc.go:40.50,42.48 1 0 +github.com/muety/wakapi/services/misc.go:46.2,48.19 3 0 +github.com/muety/wakapi/services/misc.go:42.48,44.3 1 0 +github.com/muety/wakapi/services/misc.go:51.51,53.16 2 0 +github.com/muety/wakapi/services/misc.go:57.2,60.26 3 0 +github.com/muety/wakapi/services/misc.go:66.2,68.40 2 0 +github.com/muety/wakapi/services/misc.go:73.2,75.33 3 0 +github.com/muety/wakapi/services/misc.go:79.2,84.17 2 0 +github.com/muety/wakapi/services/misc.go:88.2,91.17 1 0 +github.com/muety/wakapi/services/misc.go:95.2,95.12 1 0 +github.com/muety/wakapi/services/misc.go:53.16,55.3 1 0 +github.com/muety/wakapi/services/misc.go:60.26,65.3 1 0 +github.com/muety/wakapi/services/misc.go:68.40,70.3 1 0 +github.com/muety/wakapi/services/misc.go:75.33,78.3 2 0 +github.com/muety/wakapi/services/misc.go:84.17,86.3 1 0 +github.com/muety/wakapi/services/misc.go:91.17,93.3 1 0 +github.com/muety/wakapi/services/misc.go:98.116,99.24 1 0 +github.com/muety/wakapi/services/misc.go:99.24,100.156 1 0 +github.com/muety/wakapi/services/misc.go:100.156,102.4 1 0 +github.com/muety/wakapi/services/misc.go:102.9,107.4 1 0 +github.com/muety/wakapi/services/alias.go:18.77,23.2 1 1 +github.com/muety/wakapi/services/alias.go:27.60,28.43 1 1 +github.com/muety/wakapi/services/alias.go:31.2,31.14 1 1 +github.com/muety/wakapi/services/alias.go:28.43,30.3 1 1 +github.com/muety/wakapi/services/alias.go:34.62,36.16 2 1 +github.com/muety/wakapi/services/alias.go:39.2,39.12 1 1 +github.com/muety/wakapi/services/alias.go:36.16,38.3 1 1 +github.com/muety/wakapi/services/alias.go:42.59,43.51 1 1 +github.com/muety/wakapi/services/alias.go:43.51,45.3 1 0 +github.com/muety/wakapi/services/alias.go:48.76,49.32 1 0 +github.com/muety/wakapi/services/alias.go:52.2,52.49 1 0 +github.com/muety/wakapi/services/alias.go:49.32,51.3 1 0 +github.com/muety/wakapi/services/alias.go:52.49,54.3 1 0 +github.com/muety/wakapi/services/alias.go:54.8,56.3 1 0 +github.com/muety/wakapi/services/alias.go:59.113,60.32 1 0 +github.com/muety/wakapi/services/alias.go:63.2,63.49 1 0 +github.com/muety/wakapi/services/alias.go:60.32,62.3 1 0 +github.com/muety/wakapi/services/alias.go:63.49,65.47 2 0 +github.com/muety/wakapi/services/alias.go:70.3,70.30 1 0 +github.com/muety/wakapi/services/alias.go:65.47,66.45 1 0 +github.com/muety/wakapi/services/alias.go:66.45,68.5 1 0 +github.com/muety/wakapi/services/alias.go:71.8,73.3 1 0 +github.com/muety/wakapi/services/alias.go:76.108,77.32 1 1 +github.com/muety/wakapi/services/alias.go:81.2,81.49 1 1 +github.com/muety/wakapi/services/alias.go:89.2,89.19 1 1 +github.com/muety/wakapi/services/alias.go:77.32,79.3 1 1 +github.com/muety/wakapi/services/alias.go:81.49,82.47 1 1 +github.com/muety/wakapi/services/alias.go:82.47,83.49 1 1 +github.com/muety/wakapi/services/alias.go:83.49,85.5 1 1 +github.com/muety/wakapi/services/alias.go:92.77,94.16 2 0 +github.com/muety/wakapi/services/alias.go:97.2,98.20 2 0 +github.com/muety/wakapi/services/alias.go:94.16,96.3 1 0 +github.com/muety/wakapi/services/alias.go:101.60,102.24 1 0 +github.com/muety/wakapi/services/alias.go:105.2,107.12 3 0 +github.com/muety/wakapi/services/alias.go:102.24,104.3 1 0 +github.com/muety/wakapi/services/alias.go:110.69,113.28 3 0 +github.com/muety/wakapi/services/alias.go:121.2,123.31 2 0 +github.com/muety/wakapi/services/alias.go:127.2,127.12 1 0 +github.com/muety/wakapi/services/alias.go:113.28,114.21 1 0 +github.com/muety/wakapi/services/alias.go:117.3,118.16 2 0 +github.com/muety/wakapi/services/alias.go:114.21,116.4 1 0 +github.com/muety/wakapi/services/alias.go:123.31,125.3 1 0 github.com/muety/wakapi/services/duration.go:16.78,22.2 2 1 github.com/muety/wakapi/services/duration.go:24.123,26.16 2 1 github.com/muety/wakapi/services/duration.go:31.2,36.31 4 1 @@ -1062,53 +1134,3 @@ github.com/muety/wakapi/services/duration.go:73.31,74.26 1 1 github.com/muety/wakapi/services/duration.go:74.26,75.23 1 1 github.com/muety/wakapi/services/duration.go:78.4,78.36 1 1 github.com/muety/wakapi/services/duration.go:75.23,77.5 1 1 -github.com/muety/wakapi/services/misc.go:21.126,28.2 1 0 -github.com/muety/wakapi/services/misc.go:40.50,42.48 1 0 -github.com/muety/wakapi/services/misc.go:46.2,48.19 3 0 -github.com/muety/wakapi/services/misc.go:42.48,44.3 1 0 -github.com/muety/wakapi/services/misc.go:51.51,53.16 2 0 -github.com/muety/wakapi/services/misc.go:57.2,60.26 3 0 -github.com/muety/wakapi/services/misc.go:66.2,68.40 2 0 -github.com/muety/wakapi/services/misc.go:73.2,75.33 3 0 -github.com/muety/wakapi/services/misc.go:79.2,84.17 2 0 -github.com/muety/wakapi/services/misc.go:88.2,91.17 1 0 -github.com/muety/wakapi/services/misc.go:95.2,95.12 1 0 -github.com/muety/wakapi/services/misc.go:53.16,55.3 1 0 -github.com/muety/wakapi/services/misc.go:60.26,65.3 1 0 -github.com/muety/wakapi/services/misc.go:68.40,70.3 1 0 -github.com/muety/wakapi/services/misc.go:75.33,78.3 2 0 -github.com/muety/wakapi/services/misc.go:84.17,86.3 1 0 -github.com/muety/wakapi/services/misc.go:91.17,93.3 1 0 -github.com/muety/wakapi/services/misc.go:98.116,99.24 1 0 -github.com/muety/wakapi/services/misc.go:99.24,100.156 1 0 -github.com/muety/wakapi/services/misc.go:100.156,102.4 1 0 -github.com/muety/wakapi/services/misc.go:102.9,107.4 1 0 -github.com/muety/wakapi/services/report.go:30.122,44.33 4 0 -github.com/muety/wakapi/services/report.go:50.2,50.12 1 0 -github.com/muety/wakapi/services/report.go:44.33,45.31 1 0 -github.com/muety/wakapi/services/report.go:45.31,47.4 1 0 -github.com/muety/wakapi/services/report.go:53.38,57.16 3 0 -github.com/muety/wakapi/services/report.go:61.2,62.26 2 0 -github.com/muety/wakapi/services/report.go:57.16,59.3 1 0 -github.com/muety/wakapi/services/report.go:62.26,64.3 1 0 -github.com/muety/wakapi/services/report.go:69.61,74.22 3 0 -github.com/muety/wakapi/services/report.go:81.2,81.65 1 0 -github.com/muety/wakapi/services/report.go:98.2,98.24 1 0 -github.com/muety/wakapi/services/report.go:74.22,78.3 3 0 -github.com/muety/wakapi/services/report.go:81.65,91.47 3 0 -github.com/muety/wakapi/services/report.go:91.47,93.4 1 0 -github.com/muety/wakapi/services/report.go:93.9,95.4 1 0 -github.com/muety/wakapi/services/report.go:101.80,102.22 1 0 -github.com/muety/wakapi/services/report.go:107.2,107.29 1 0 -github.com/muety/wakapi/services/report.go:112.2,116.16 4 0 -github.com/muety/wakapi/services/report.go:121.2,128.65 2 0 -github.com/muety/wakapi/services/report.go:133.2,134.12 2 0 -github.com/muety/wakapi/services/report.go:102.22,105.3 2 0 -github.com/muety/wakapi/services/report.go:107.29,110.3 2 0 -github.com/muety/wakapi/services/report.go:116.16,119.3 2 0 -github.com/muety/wakapi/services/report.go:128.65,131.3 2 0 -github.com/muety/wakapi/services/report.go:137.63,138.41 1 0 -github.com/muety/wakapi/services/report.go:145.2,145.12 1 0 -github.com/muety/wakapi/services/report.go:138.41,139.30 1 0 -github.com/muety/wakapi/services/report.go:139.30,140.16 1 0 -github.com/muety/wakapi/services/report.go:140.16,142.5 1 0 diff --git a/models/summary.go b/models/summary.go index a82badb..b95550c 100644 --- a/models/summary.go +++ b/models/summary.go @@ -56,6 +56,7 @@ type SummaryParams struct { From time.Time To time.Time User *User + Filters *Filters Recompute bool } @@ -304,6 +305,26 @@ func (s *Summary) findFirstPresentType() (uint8, error) { return 127, errors.New("no type present") } +func (s *SummaryParams) HasFilters() bool { + return s.Filters != nil && !s.Filters.IsEmpty() +} + +func (s *SummaryParams) IsProjectDetails() bool { + if !s.HasFilters() { + return false + } + _, entity, filters := s.Filters.One() + return entity == SummaryProject && len(filters) == 1 // exactly one +} + +func (s *SummaryParams) GetProjectFilter() string { + if !s.IsProjectDetails() { + return "" + } + _, _, filters := s.Filters.One() + return filters[0] +} + func (s *SummaryItem) TotalFixed() time.Duration { // this is a workaround, since currently, the total time of a summary item is mistakenly represented in seconds // TODO: fix some day, while migrating persisted summary items diff --git a/routes/api/summary.go b/routes/api/summary.go index 24555fa..44aca6d 100644 --- a/routes/api/summary.go +++ b/routes/api/summary.go @@ -1,12 +1,12 @@ package api import ( + routeutils "github.com/muety/wakapi/routes/utils" "net/http" "github.com/gorilla/mux" conf "github.com/muety/wakapi/config" "github.com/muety/wakapi/middlewares" - su "github.com/muety/wakapi/routes/utils" "github.com/muety/wakapi/services" "github.com/muety/wakapi/utils" ) @@ -51,7 +51,7 @@ func (h *SummaryApiHandler) RegisterRoutes(router *mux.Router) { // @Success 200 {object} models.Summary // @Router /summary [get] func (h *SummaryApiHandler) Get(w http.ResponseWriter, r *http.Request) { - summary, err, status := su.LoadUserSummary(h.summarySrvc, r) + summary, err, status := routeutils.LoadUserSummary(h.summarySrvc, r) if err != nil { w.WriteHeader(status) w.Write([]byte(err.Error())) diff --git a/routes/compat/wakatime/v1/all_time.go b/routes/compat/wakatime/v1/all_time.go index e1b3e23..8da804e 100644 --- a/routes/compat/wakatime/v1/all_time.go +++ b/routes/compat/wakatime/v1/all_time.go @@ -50,7 +50,7 @@ func (h *AllTimeHandler) Get(w http.ResponseWriter, r *http.Request) { return // response was already sent by util function } - summary, err, status := h.loadUserSummary(user, routeutils.ParseFilters(r)) + summary, err, status := h.loadUserSummary(user, utils.ParseSummaryFilters(r)) if err != nil { w.WriteHeader(status) w.Write([]byte(err.Error())) diff --git a/routes/compat/wakatime/v1/stats.go b/routes/compat/wakatime/v1/stats.go index 6d7cccc..5399742 100644 --- a/routes/compat/wakatime/v1/stats.go +++ b/routes/compat/wakatime/v1/stats.go @@ -9,7 +9,6 @@ import ( "github.com/muety/wakapi/middlewares" "github.com/muety/wakapi/models" v1 "github.com/muety/wakapi/models/compat/wakatime/v1" - routeutils "github.com/muety/wakapi/routes/utils" "github.com/muety/wakapi/services" "github.com/muety/wakapi/utils" ) @@ -95,7 +94,7 @@ func (h *StatsHandler) Get(w http.ResponseWriter, r *http.Request) { return } - summary, err, status := h.loadUserSummary(requestedUser, rangeFrom, rangeTo, routeutils.ParseFilters(r)) + summary, err, status := h.loadUserSummary(requestedUser, rangeFrom, rangeTo, utils.ParseSummaryFilters(r)) if err != nil { w.WriteHeader(status) w.Write([]byte(err.Error())) diff --git a/routes/compat/wakatime/v1/summaries.go b/routes/compat/wakatime/v1/summaries.go index 9a24eeb..19ba5cb 100644 --- a/routes/compat/wakatime/v1/summaries.go +++ b/routes/compat/wakatime/v1/summaries.go @@ -132,7 +132,7 @@ func (h *SummariesHandler) loadUserSummaries(r *http.Request) ([]*models.Summary summaries := make([]*models.Summary, len(intervals)) // filtering - filters := routeutils.ParseFilters(r) + filters := utils.ParseSummaryFilters(r) for i, interval := range intervals { summary, err := h.summarySrvc.Aliased(interval[0], interval[1], user, h.summarySrvc.Retrieve, filters, end.After(time.Now())) diff --git a/routes/summary.go b/routes/summary.go index 0d194ed..42986b0 100644 --- a/routes/summary.go +++ b/routes/summary.go @@ -26,11 +26,13 @@ func NewSummaryHandler(summaryService services.ISummaryService, userService serv } func (h *SummaryHandler) RegisterRoutes(router *mux.Router) { - r := router.PathPrefix("/summary").Subrouter() - r.Use( - middlewares.NewAuthenticateMiddleware(h.userSrvc).WithRedirectTarget(defaultErrorRedirectTarget()).Handler, - ) - r.Methods(http.MethodGet).HandlerFunc(h.GetIndex) + r1 := router.PathPrefix("/summary").Subrouter() + r1.Use(middlewares.NewAuthenticateMiddleware(h.userSrvc).WithRedirectTarget(defaultErrorRedirectTarget()).Handler) + r1.Methods(http.MethodGet).HandlerFunc(h.GetIndex) + + r2 := router.PathPrefix("/summary").Subrouter() + r2.Use(middlewares.NewAuthenticateMiddleware(h.userSrvc).WithRedirectTarget(defaultErrorRedirectTarget()).Handler) + r2.Methods(http.MethodGet).HandlerFunc(h.GetIndex) } func (h *SummaryHandler) GetIndex(w http.ResponseWriter, r *http.Request) { diff --git a/routes/utils/summary_utils.go b/routes/utils/summary_utils.go index 9706e9d..739434f 100644 --- a/routes/utils/summary_utils.go +++ b/routes/utils/summary_utils.go @@ -20,7 +20,7 @@ func LoadUserSummary(ss services.ISummaryService, r *http.Request) (*models.Summ retrieveSummary = ss.Summarize } - summary, err := ss.Aliased(summaryParams.From, summaryParams.To, summaryParams.User, retrieveSummary, ParseFilters(r), summaryParams.Recompute) + summary, err := ss.Aliased(summaryParams.From, summaryParams.To, summaryParams.User, retrieveSummary, summaryParams.Filters, summaryParams.Recompute) if err != nil { return nil, err, http.StatusInternalServerError } @@ -30,29 +30,3 @@ func LoadUserSummary(ss services.ISummaryService, r *http.Request) (*models.Summ return summary, nil, http.StatusOK } - -func ParseFilters(r *http.Request) *models.Filters { - filters := &models.Filters{} - if q := r.URL.Query().Get("project"); q != "" { - filters.With(models.SummaryProject, q) - } - if q := r.URL.Query().Get("language"); q != "" { - filters.With(models.SummaryLanguage, q) - } - if q := r.URL.Query().Get("editor"); q != "" { - filters.With(models.SummaryEditor, q) - } - if q := r.URL.Query().Get("machine"); q != "" { - filters.With(models.SummaryMachine, q) - } - if q := r.URL.Query().Get("operating_system"); q != "" { - filters.With(models.SummaryOS, q) - } - if q := r.URL.Query().Get("label"); q != "" { - filters.With(models.SummaryLabel, q) - } - if q := r.URL.Query().Get("branch"); q != "" { - filters.With(models.SummaryBranch, q) - } - return filters -} diff --git a/static/assets/css/app.dist.css b/static/assets/css/app.dist.css index 3497e02..5f10006 100644 --- a/static/assets/css/app.dist.css +++ b/static/assets/css/app.dist.css @@ -1 +1 @@ -/*! tailwindcss v2.2.19 | MIT License | https://tailwindcss.com*//*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */html{-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}hr{height:0;color:inherit}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}::-moz-focus-inner{border-style:none;padding:0}legend{padding:0}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:initial;background-image:none}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{box-sizing:border-box;border:0 solid}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input:-ms-input-placeholder,textarea:-ms-input-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:after,:before{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.absolute{position:absolute}.relative{position:relative}.top-0{top:0}.right-0{right:0}.z-10{z-index:10}.float-right{float:right}.m-0{margin:0}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.mt-16{margin-top:4rem}.mt-20{margin-top:5rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mr-8{margin-right:2rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-8{margin-bottom:2rem}.mb-10{margin-bottom:2.5rem}.mb-16{margin-bottom:4rem}.-mb-1{margin-bottom:-.25rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.-ml-1{margin-left:-.25rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.hidden{display:none}.h-4{height:1rem}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-4{width:1rem}.w-12{width:3rem}.w-40{width:10rem}.w-1\/2{width:50%}.w-full{width:100%}.max-w-lg{max-width:32rem}.max-w-4xl{max-width:56rem}.max-w-screen-sm{max-width:640px}.max-w-screen-lg{max-width:1024px}.max-w-screen-xl{max-width:1280px}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.flex-shrink{flex-shrink:1}.flex-grow{flex-grow:1}@-webkit-keyframes spin{to{transform:rotate(1turn)}}@keyframes spin{to{transform:rotate(1turn)}}@-webkit-keyframes ping{75%,to{transform:scale(2);opacity:0}}@keyframes ping{75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}.cursor-pointer{cursor:pointer}.cursor-not-allowed{cursor:not-allowed}.resize{resize:both}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-6{row-gap:1.5rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.rounded-sm{border-radius:.125rem}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-full{border-radius:9999px}.border-2{border-width:2px}.border-4{border-width:4px}.border{border-width:1px}.border-t{border-top-width:1px}.border-l{border-left-width:1px}.border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.bg-transparent{background-color:initial}.bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.focus\:bg-gray-800:focus,.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-4{padding:1rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pt-10{padding-top:2.5rem}.pb-4{padding-bottom:1rem}.pb-10{padding-bottom:2.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-xs{font-size:.75rem;line-height:1rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-8xl{font-size:6rem;line-height:1}.font-semibold{font-weight:600}.capitalize{text-transform:capitalize}.leading-none{line-height:1}.leading-snug{line-height:1.375}.text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*,:after,:before{--tw-shadow:0 0 #0000}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.shadow,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.outline-none{outline:2px solid transparent;outline-offset:2px}*,:after,:before{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000}body{font-family:Source Sans\ 3,Roboto,Helvetica Neue,Helvetica,Arial,sans-serif}[v-cloak]{display:none}.bg-gray-850{background-color:#242b3a}.hover\:bg-gray-850:hover{--bg-opacity:1;background-color:#242b3a}.text-xxs{font-size:.65rem}.text-8xl{font-size:5rem;line-height:1.1}.imp\:cursor-not-allowed{cursor:not-allowed!important}.h1{margin:0;font-size:1.875rem;line-height:2.25rem;font-weight:600;--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.h1-subcaption{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.btn-default,.h1-subcaption{font-size:.875rem;line-height:1.25rem}.btn-default{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity));padding:.5rem 1rem;font-weight:600;--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.btn-default:hover{--bg-opacity:1;background-color:#242b3a}.btn-primary{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.btn-primary:hover{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.btn-primary{padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.btn-danger{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.btn-danger:hover{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.btn-danger{padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.input-default{width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem}.input-default:focus{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.input-default{padding:.5rem 1rem;--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity));outline:2px solid transparent;outline-offset:2px;background-color:#242b3a}.select-default{cursor:pointer;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem}.select-default:focus{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.select-default{padding:.5rem 1rem;--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity));outline:2px solid transparent;outline-offset:2px;background-color:#242b3a}.menu-item{display:flex;cursor:pointer;align-items:center}.menu-item>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.menu-item{border-radius:.25rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600}.menu-item:hover{--bg-opacity:1;background-color:#242b3a}.submenu-item{border-radius:.25rem}.submenu-item:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.submenu-item{padding:.25rem;text-align:right}.chip{margin-bottom:.25rem;display:inline-block;border-radius:.25rem;border-radius:9999px;padding:.25rem .5rem;font-size:.75rem;line-height:1rem;background-color:#242b3a}.chip,.link{font-weight:600}.link{color:rgba(156,163,175,var(--tw-text-opacity))}.link,.link:hover{--tw-text-opacity:1}.link:hover{color:rgba(209,213,219,var(--tw-text-opacity))}::-webkit-calendar-picker-indicator{filter:invert(1);cursor:pointer}@media (min-width:640px){.sm\:inline-block{display:inline-block}.sm\:flex{display:flex}}@media (min-width:768px){.md\:mb-0{margin-bottom:0}.md\:flex{display:flex}.md\:w-1\/2{width:50%}.md\:w-1\/3{width:33.333333%}.md\:w-2\/3{width:66.666667%}.md\:w-3\/4{width:75%}.md\:flex-nowrap{flex-wrap:nowrap}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}}@media (min-width:1024px){.lg\:inline-block{display:inline-block}.lg\:w-1\/2{width:50%}.lg\:w-3\/4{width:75%}.lg\:px-24{padding-left:6rem;padding-right:6rem}} \ No newline at end of file +/*! tailwindcss v2.2.19 | MIT License | https://tailwindcss.com*//*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */html{-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}hr{height:0;color:inherit}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}::-moz-focus-inner{border-style:none;padding:0}legend{padding:0}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:initial;background-image:none}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{box-sizing:border-box;border:0 solid}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input:-ms-input-placeholder,textarea:-ms-input-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:after,:before{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.absolute{position:absolute}.relative{position:relative}.top-0{top:0}.right-0{right:0}.z-10{z-index:10}.row-span-2{grid-row:span 2/span 2}.float-right{float:right}.m-0{margin:0}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.mt-16{margin-top:4rem}.mt-20{margin-top:5rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mr-8{margin-right:2rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-8{margin-bottom:2rem}.mb-10{margin-bottom:2.5rem}.mb-16{margin-bottom:4rem}.-mb-1{margin-bottom:-.25rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.-ml-1{margin-left:-.25rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-4{height:1rem}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-4{width:1rem}.w-12{width:3rem}.w-40{width:10rem}.w-1\/2{width:50%}.w-full{width:100%}.max-w-lg{max-width:32rem}.max-w-4xl{max-width:56rem}.max-w-screen-sm{max-width:640px}.max-w-screen-lg{max-width:1024px}.max-w-screen-xl{max-width:1280px}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.flex-shrink{flex-shrink:1}.flex-grow{flex-grow:1}@-webkit-keyframes spin{to{transform:rotate(1turn)}}@keyframes spin{to{transform:rotate(1turn)}}@-webkit-keyframes ping{75%,to{transform:scale(2);opacity:0}}@keyframes ping{75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}.cursor-pointer{cursor:pointer}.cursor-not-allowed{cursor:not-allowed}.resize{resize:both}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-6{row-gap:1.5rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.rounded-sm{border-radius:.125rem}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-full{border-radius:9999px}.border-2{border-width:2px}.border-4{border-width:4px}.border{border-width:1px}.border-t{border-top-width:1px}.border-l{border-left-width:1px}.border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.bg-transparent{background-color:initial}.bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.focus\:bg-gray-800:focus,.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-4{padding:1rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pt-10{padding-top:2.5rem}.pb-4{padding-bottom:1rem}.pb-10{padding-bottom:2.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-xs{font-size:.75rem;line-height:1rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-8xl{font-size:6rem;line-height:1}.font-semibold{font-weight:600}.capitalize{text-transform:capitalize}.leading-none{line-height:1}.leading-snug{line-height:1.375}.text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*,:after,:before{--tw-shadow:0 0 #0000}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.shadow,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.outline-none{outline:2px solid transparent;outline-offset:2px}*,:after,:before{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000}body{font-family:Source Sans\ 3,Roboto,Helvetica Neue,Helvetica,Arial,sans-serif}[v-cloak]{display:none}.bg-gray-850{background-color:#242b3a}.hover\:bg-gray-850:hover{--bg-opacity:1;background-color:#242b3a}.text-xxs{font-size:.65rem}.text-8xl{font-size:5rem;line-height:1.1}.imp\:cursor-not-allowed{cursor:not-allowed!important}.h1{margin:0;font-size:1.875rem;line-height:2.25rem;font-weight:600;--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.h1-subcaption{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.btn-default,.h1-subcaption{font-size:.875rem;line-height:1.25rem}.btn-default{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity));padding:.5rem 1rem;font-weight:600;--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.btn-default:hover{--bg-opacity:1;background-color:#242b3a}.btn-primary{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.btn-primary:hover{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.btn-primary{padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.btn-danger{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.btn-danger:hover{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.btn-danger{padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.input-default{width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem}.input-default:focus{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.input-default{padding:.5rem 1rem;--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity));outline:2px solid transparent;outline-offset:2px;background-color:#242b3a}.select-default{cursor:pointer;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem}.select-default:focus{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.select-default{padding:.5rem 1rem;--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity));outline:2px solid transparent;outline-offset:2px;background-color:#242b3a}.menu-item{display:flex;cursor:pointer;align-items:center}.menu-item>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.menu-item{border-radius:.25rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600}.menu-item:hover{--bg-opacity:1;background-color:#242b3a}.submenu-item{border-radius:.25rem}.submenu-item:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.submenu-item{padding:.25rem;text-align:right}.chip{margin-bottom:.25rem;display:inline-block;border-radius:.25rem;border-radius:9999px;padding:.25rem .5rem;font-size:.75rem;line-height:1rem;background-color:#242b3a}.chip,.link{font-weight:600}.link{color:rgba(156,163,175,var(--tw-text-opacity))}.link,.link:hover{--tw-text-opacity:1}.link:hover{color:rgba(209,213,219,var(--tw-text-opacity))}::-webkit-calendar-picker-indicator{filter:invert(1);cursor:pointer}@media (min-width:640px){.sm\:inline-block{display:inline-block}.sm\:flex{display:flex}}@media (min-width:768px){.md\:mb-0{margin-bottom:0}.md\:flex{display:flex}.md\:w-1\/2{width:50%}.md\:w-1\/3{width:33.333333%}.md\:w-2\/3{width:66.666667%}.md\:w-3\/4{width:75%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-nowrap{flex-wrap:nowrap}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}}@media (min-width:1024px){.lg\:inline-block{display:inline-block}.lg\:w-3\/4{width:75%}.lg\:px-24{padding-left:6rem;padding-right:6rem}} \ No newline at end of file diff --git a/static/assets/js/components/time-picker.js b/static/assets/js/components/time-picker.js index 68eb190..fcc515d 100644 --- a/static/assets/js/components/time-picker.js +++ b/static/assets/js/components/time-picker.js @@ -8,6 +8,11 @@ function TimePicker({ fromDate, toDate, timeSelection }) { fromDate: fromDate, toDate: toDate, timeSelection: timeSelection, + intervalLink(interval) { + const queryParams = new URLSearchParams(window.location.search) + queryParams.set('interval', interval) + return `summary?${queryParams.toString()}` + }, onDateUpdated() { document.getElementById('time-picker-form').submit() }, diff --git a/static/assets/js/summary.js b/static/assets/js/summary.js index 9ad220a..7de3c46 100644 --- a/static/assets/js/summary.js +++ b/static/assets/js/summary.js @@ -13,6 +13,7 @@ const editorsCanvas = document.getElementById('chart-editor') const languagesCanvas = document.getElementById('chart-language') const machinesCanvas = document.getElementById('chart-machine') const labelsCanvas = document.getElementById('chart-label') +const branchesCanvas = document.getElementById('chart-branches') const projectContainer = document.getElementById('project-container') const osContainer = document.getElementById('os-container') @@ -20,10 +21,11 @@ const editorContainer = document.getElementById('editor-container') const languageContainer = document.getElementById('language-container') const machineContainer = document.getElementById('machine-container') const labelContainer = document.getElementById('label-container') +const branchContainer = document.getElementById('branch-container') -const containers = [projectContainer, osContainer, editorContainer, languageContainer, machineContainer, labelContainer] -const canvases = [projectsCanvas, osCanvas, editorsCanvas, languagesCanvas, machinesCanvas, labelsCanvas] -const data = [wakapiData.projects, wakapiData.operatingSystems, wakapiData.editors, wakapiData.languages, wakapiData.machines, wakapiData.labels] +const containers = [projectContainer, osContainer, editorContainer, languageContainer, machineContainer, labelContainer, branchContainer] +const canvases = [projectsCanvas, osCanvas, editorsCanvas, languagesCanvas, machinesCanvas, labelsCanvas, branchesCanvas] +const data = [wakapiData.projects, wakapiData.operatingSystems, wakapiData.editors, wakapiData.languages, wakapiData.machines, wakapiData.labels, wakapiData.branches] let topNPickers = [...document.getElementsByClassName('top-picker')] topNPickers.sort(((a, b) => parseInt(a.attributes['data-entity'].value) - parseInt(b.attributes['data-entity'].value))) @@ -64,9 +66,10 @@ function draw(subselection) { callbacks: { label: (item) => { const d = wakapiData[key][item.dataIndex] - return `${d.key}: ${d.total.toString().toHHMMSS()}` + return ` ${d.key}: ${d.total.toString().toHHMMSS()}` }, - title: () => 'Total Time' + title: () => 'Total Time', + footer: () => key === 'projects' ? 'Click for details' : null } } } @@ -127,6 +130,16 @@ function draw(subselection) { tooltip: getTooltipOptions('projects'), }, maintainAspectRatio: false, + onClick: (event, data) => { + const idx = data[0].index + const name = wakapiData.projects[idx].key + const query = new URLSearchParams(window.location.search) + query.set('project', name) + window.location.replace(`${window.location.pathname.slice(1)}?${query.toString()}`) + }, + onHover: (event, elem) => { + event.native.target.style.cursor = elem[0] ? 'pointer' : 'default' + } } }) : null @@ -319,12 +332,58 @@ function draw(subselection) { }) : null + let branchChart = branchesCanvas && !branchesCanvas.classList.contains('hidden') && shouldUpdate(0) + ? new Chart(branchesCanvas.getContext('2d'), { + type: "bar", + data: { + datasets: [{ + data: wakapiData.branches + .slice(0, Math.min(showTopN[0], wakapiData.branches.length)) + .map(p => parseInt(p.total)), + backgroundColor: wakapiData.branches.map((p, i) => { + const c = hexToRgb(getColor(p.key, i % baseColors.length)) + return `rgba(${c.r}, ${c.g}, ${c.b}, 1)` + }), + hoverBackgroundColor: wakapiData.branches.map((p, i) => { + const c = hexToRgb(getColor(p.key, i % baseColors.length)) + return `rgba(${c.r}, ${c.g}, ${c.b}, 0.8)` + }), + }], + labels: wakapiData.branches + .slice(0, Math.min(showTopN[0], wakapiData.branches.length)) + .map(p => p.key) + }, + options: { + indexAxis: 'y', + scales: { + xAxes: { + title: { + display: true, + text: 'Duration (hh:mm:ss)', + }, + ticks: { + callback: (label) => label.toString().toHHMMSS(), + } + } + }, + plugins: { + legend: { + display: false, + }, + tooltip: getTooltipOptions('branches'), + }, + maintainAspectRatio: false, + } + }) + : null + charts[0] = projectChart ? projectChart : charts[0] charts[1] = osChart ? osChart : charts[1] charts[2] = editorChart ? editorChart : charts[2] charts[3] = languageChart ? languageChart : charts[3] charts[4] = machineChart ? machineChart : charts[4] charts[5] = labelChart ? labelChart : charts[5] + charts[6] = branchChart ? branchChart : charts[6] } function parseTopN() { diff --git a/utils/summary.go b/utils/summary.go index 4a78e2c..11f8c3a 100644 --- a/utils/summary.go +++ b/utils/summary.go @@ -96,14 +96,43 @@ func ParseSummaryParams(r *http.Request) (*models.SummaryParams, error) { recompute := params.Get("recompute") != "" && params.Get("recompute") != "false" + filters := ParseSummaryFilters(r) + return &models.SummaryParams{ From: from, To: to, User: user, Recompute: recompute, + Filters: filters, }, nil } +func ParseSummaryFilters(r *http.Request) *models.Filters { + filters := &models.Filters{} + if q := r.URL.Query().Get("project"); q != "" { + filters.With(models.SummaryProject, q) + } + if q := r.URL.Query().Get("language"); q != "" { + filters.With(models.SummaryLanguage, q) + } + if q := r.URL.Query().Get("editor"); q != "" { + filters.With(models.SummaryEditor, q) + } + if q := r.URL.Query().Get("machine"); q != "" { + filters.With(models.SummaryMachine, q) + } + if q := r.URL.Query().Get("operating_system"); q != "" { + filters.With(models.SummaryOS, q) + } + if q := r.URL.Query().Get("label"); q != "" { + filters.With(models.SummaryLabel, q) + } + if q := r.URL.Query().Get("branch"); q != "" { + filters.With(models.SummaryBranch, q) + } + return filters +} + func extractUser(r *http.Request) *models.User { type principalGetter interface { GetPrincipal() *models.User diff --git a/views/summary.tpl.html b/views/summary.tpl.html index 765d2ee..4b936a3 100644 --- a/views/summary.tpl.html +++ b/views/summary.tpl.html @@ -30,6 +30,7 @@ {{ if .User.HasData }} + {{ if not .IsProjectDetails }}
@@ -57,56 +58,68 @@ {{ .MaxByToString 2 }}
+ {{ else }} +
+

Project "{{ .GetProjectFilter }}"

+

{{ .TotalTime | duration }}

+
+ {{ end }} -
-
-
-
- Projects -
- -
-
- -