mirror of
https://gitlab.com/openstapps/openstapps.git
synced 2026-01-19 08:02:55 +00:00
feat: use mustache instead of tangular
This commit is contained in:
@@ -10,3 +10,4 @@
|
||||
!package-lock.json
|
||||
!README.md
|
||||
!src
|
||||
!templates
|
||||
|
||||
671
package-lock.json
generated
671
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
26
package.json
26
package.json
@@ -24,35 +24,25 @@
|
||||
"dependencies": {
|
||||
"@openstapps/gitlab-api": "0.5.1",
|
||||
"@openstapps/logger": "0.0.5",
|
||||
"@slack/client": "4.9.0",
|
||||
"@types/del": "3.0.1",
|
||||
"@slack/client": "4.12.0",
|
||||
"@types/glob": "7.1.1",
|
||||
"@types/inquirer": "0.0.43",
|
||||
"@types/node": "10.12.27",
|
||||
"@types/pad": "1.0.2",
|
||||
"@types/request": "2.48.1",
|
||||
"@types/semver": "5.5.0",
|
||||
"@types/mustache": "0.8.32",
|
||||
"@types/node": "10.12.30",
|
||||
"async-pool-native": "0.1.0",
|
||||
"commander": "2.19.0",
|
||||
"del": "3.0.0",
|
||||
"glob": "7.1.3",
|
||||
"inquirer": "6.2.2",
|
||||
"moment": "2.24.0",
|
||||
"pad": "2.2.2",
|
||||
"request": "2.88.0",
|
||||
"semver": "5.6.0",
|
||||
"tangular": "2.0.1",
|
||||
"toposort": "2.0.2"
|
||||
"mustache": "3.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@openstapps/configuration": "0.6.0",
|
||||
"@openstapps/configuration": "0.7.0",
|
||||
"conventional-changelog-cli": "2.0.12",
|
||||
"prepend-file-cli": "1.0.6",
|
||||
"rimraf": "2.6.3",
|
||||
"ts-node": "8.0.2",
|
||||
"tslint": "5.13.0",
|
||||
"ts-node": "8.0.3",
|
||||
"tslint": "5.14.0",
|
||||
"typedoc": "0.14.2",
|
||||
"typescript": "3.3.3333"
|
||||
"typescript": "3.3.4000"
|
||||
},
|
||||
"main": "lib/common.js",
|
||||
"typings": "lib/common.d.ts",
|
||||
|
||||
132
reports/2019-03-27.md
Normal file
132
reports/2019-03-27.md
Normal file
@@ -0,0 +1,132 @@
|
||||
# Meeting 2019-03-27
|
||||
|
||||
## <img src="https://secure.gravatar.com/avatar/e7fffaba0ad02819f47c790d73c77ae0?s=80&d=identicon" height="30"/> Rainer Killinger
|
||||
|
||||
### open: 4, closed: 3
|
||||
|
||||
quota closed: 42%
|
||||
|
||||
| __title__ | __status__ | __project__ | __weeks__ |
|
||||
| --- | --- | --- | --- |
|
||||
| __[Insert sample data from the StappsCore into the backend](https://gitlab.com/openstapps/minimal-connector/issues/4)__<br />__Labels:__ meeting | | [openstapps/minimal-connector](https://gitlab.com/openstapps/minimal-connector) | 0 |
|
||||
| __[Simplify translation implementation](https://gitlab.com/openstapps/core/issues/43)__<br />__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 0 |
|
||||
| __[Update transport security in nginx configuration](https://gitlab.com/openstapps/proxy/issues/1)__<br />__Labels:__ meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/proxy/merge_requests/3) | [openstapps/proxy](https://gitlab.com/openstapps/proxy) | 3 |
|
||||
| __[Add notion of study modules](https://gitlab.com/openstapps/core/issues/20)__<br />__Labels:__ feature, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/core/merge_requests/10) | [openstapps/core](https://gitlab.com/openstapps/core) | 11 |
|
||||
| __[Manual docker image publishing fails](https://gitlab.com/openstapps/backend/issues/28)__<br />__Labels:__ __bug__, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 1 |
|
||||
| __[Fix folder permissions for elasticsearch volume](https://gitlab.com/openstapps/minimal-deployment/issues/5)__<br />__Labels:__ meeting | | [openstapps/minimal-deployment](https://gitlab.com/openstapps/minimal-deployment) | 0 |
|
||||
| __[Test docker image building](https://gitlab.com/openstapps/proxy/issues/7)__<br />__Labels:__ meeting, testing | | [openstapps/proxy](https://gitlab.com/openstapps/proxy) | 1 |
|
||||
## <img src="https://secure.gravatar.com/avatar/160dcb84d23a960d774959186a440882?s=80&d=identicon" height="30"/> Jovan Krunić
|
||||
|
||||
### open: 33, closed: 1
|
||||
|
||||
quota closed: 2%
|
||||
|
||||
| __title__ | __status__ | __project__ | __weeks__ |
|
||||
| --- | --- | --- | --- |
|
||||
| __[Improve image docs and standardize usage](https://gitlab.com/openstapps/core/issues/44)__<br />__Labels:__ __bug__, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 0 |
|
||||
| __[Include sample JSON files within the published package](https://gitlab.com/openstapps/core/issues/46)__<br />__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 0 |
|
||||
| __[Use review apps from gitlab to provide demo](https://gitlab.com/openstapps/app/issues/42)__<br />__Labels:__ feature, meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 0 |
|
||||
| __[Make sure appearance is compatible with (new) devices with cutouts](https://gitlab.com/openstapps/app/issues/40)__<br />__Labels:__ improvement, meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 3 |
|
||||
| __[Inconsistency in definitions of things without references](https://gitlab.com/openstapps/core/issues/41)__<br />__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 3 |
|
||||
| __[Show dishes for multiple days](https://gitlab.com/openstapps/app/issues/39)__<br />__Labels:__ feature, meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 3 |
|
||||
| __[Use fake backend - backendless development](https://gitlab.com/openstapps/app/issues/37)__<br />__Labels:__ improvement, meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 3 |
|
||||
| __[add a main page for the group (whole project)](https://gitlab.com/openstapps/openstapps.gitlab.io/issues/1)__<br />__Labels:__ documentation, meeting, organization | | [openstapps/openstapps.gitlab.io](https://gitlab.com/openstapps/openstapps.gitlab.io) | 6 |
|
||||
| __[upgrade to Ionic 4.0 (stable)](https://gitlab.com/openstapps/app/issues/35)__<br />__Labels:__ improvement, meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 6 |
|
||||
| __[Develop a prototype for authentication](https://gitlab.com/openstapps/backend/issues/8)__<br />__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
|
||||
| __[Add examples for routes](https://gitlab.com/openstapps/core/issues/17)__<br />__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 13 |
|
||||
| __[(TODO: complete) school module: evaluate and create a prototype of a generic app](https://gitlab.com/openstapps/app/issues/29)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[List of most recent searches](https://gitlab.com/openstapps/app/issues/28)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Sorting by categories should be default for certain views](https://gitlab.com/openstapps/app/issues/25)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Evaluate solutions for adding monitoring (automatic error reports)](https://gitlab.com/openstapps/app/issues/24)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Todos module - predefined and user-defined tasks](https://gitlab.com/openstapps/app/issues/23)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Add deep-linking support](https://gitlab.com/openstapps/app/issues/22)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Show menus of (student) canteens for multiple days](https://gitlab.com/openstapps/app/issues/19)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Limit loaded places by the current zoom level](https://gitlab.com/openstapps/app/issues/18)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Appointment system module - queue number and estimated waiting time](https://gitlab.com/openstapps/app/issues/17)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __["About" module - app information and policies](https://gitlab.com/openstapps/app/issues/16)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Catalog tree module - catalog of university events](https://gitlab.com/openstapps/app/issues/15)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Styles and images](https://gitlab.com/openstapps/app/issues/14)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Home module - home page with widgets](https://gitlab.com/openstapps/app/issues/13)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Map module: show places and position](https://gitlab.com/openstapps/app/issues/12)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Export persons into the phone's contact list](https://gitlab.com/openstapps/app/issues/11)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Favorites module - save frequently used data as favorites](https://gitlab.com/openstapps/app/issues/10)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Events (timetable) module - schedule and calendar](https://gitlab.com/openstapps/app/issues/8)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[First start module: initial information and settings](https://gitlab.com/openstapps/app/issues/6)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 14 |
|
||||
| __[Use skeleton screens](https://gitlab.com/openstapps/app/issues/4)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 14 |
|
||||
| __[Data synchronization and consistency](https://gitlab.com/openstapps/app/issues/2)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 14 |
|
||||
| __[Data module - data handling and presentation](https://gitlab.com/openstapps/app/issues/1)__<br />__Labels:__ meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/app/merge_requests/2) | [openstapps/app](https://gitlab.com/openstapps/app) | 14 |
|
||||
| __[Add an npm initializer package](https://gitlab.com/openstapps/projectmanagement/issues/2)__<br />__Labels:__ meeting | | [openstapps/projectmanagement](https://gitlab.com/openstapps/projectmanagement) | 15 |
|
||||
| __[Backend should "wait" for the database container to be ready](https://gitlab.com/openstapps/minimal-deployment/issues/1)__<br />__Labels:__ meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" /> | [openstapps/minimal-deployment](https://gitlab.com/openstapps/minimal-deployment) | 6 |
|
||||
## <img src="https://secure.gravatar.com/avatar/cc0abc686533bdcd56ef8766e06850f5?s=80&d=identicon" height="30"/> Karl-Philipp Wulfert
|
||||
|
||||
### open: 9, closed: 0
|
||||
|
||||
quota closed: 0%
|
||||
|
||||
| __title__ | __status__ | __project__ | __weeks__ |
|
||||
| --- | --- | --- | --- |
|
||||
| __[Add systemd service file and error handler](https://gitlab.com/openstapps/proxy/issues/5)__<br />__Labels:__ feature, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/proxy/merge_requests/2) | [openstapps/proxy](https://gitlab.com/openstapps/proxy) | 3 |
|
||||
| __[Add issue templates](https://gitlab.com/openstapps/minimal-deployment/issues/3)__<br />__Labels:__ meeting | | [openstapps/minimal-deployment](https://gitlab.com/openstapps/minimal-deployment) | 3 |
|
||||
| __[Remove links to old GitLab instance](https://gitlab.com/openstapps/proxy/issues/3)__<br />__Labels:__ meeting | | [openstapps/proxy](https://gitlab.com/openstapps/proxy) | 3 |
|
||||
| __[Throws error in `production` environment: "... doesn't set an transport agent ..."](https://gitlab.com/openstapps/logger/issues/4)__<br />__Labels:__ meeting | | [openstapps/logger](https://gitlab.com/openstapps/logger) | 7 |
|
||||
| __[Support adding links to external services of a university/school](https://gitlab.com/openstapps/app/issues/21)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Include place when exporting events into the native calendar](https://gitlab.com/openstapps/app/issues/20)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Evaluate use of clickable alphabet for lists](https://gitlab.com/openstapps/app/issues/7)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[`circular-json` is deprecated](https://gitlab.com/openstapps/logger/issues/2)__<br />__Labels:__ meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/logger/merge_requests/2) | [openstapps/logger](https://gitlab.com/openstapps/logger) | 15 |
|
||||
| __[Test coverage levels are too low](https://gitlab.com/openstapps/logger/issues/1)__<br />__Labels:__ meeting | | [openstapps/logger](https://gitlab.com/openstapps/logger) | 15 |
|
||||
## <img src="https://secure.gravatar.com/avatar/98886e4ad71cd95906c95946629890b2?s=80&d=identicon" height="30"/> Michel Jonathan Schmitz
|
||||
|
||||
### open: 7, closed: 0
|
||||
|
||||
quota closed: 0%
|
||||
|
||||
| __title__ | __status__ | __project__ | __weeks__ |
|
||||
| --- | --- | --- | --- |
|
||||
| __[Provide context based search](https://gitlab.com/openstapps/core/issues/45)__<br />__Labels:__ feature, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/core/merge_requests/34) | [openstapps/core](https://gitlab.com/openstapps/core) | 0 |
|
||||
| __[minimal connector and app should be part of the minimal deployment](https://gitlab.com/openstapps/minimal-deployment/issues/2)__<br />__Labels:__ meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/minimal-deployment/merge_requests/2) | [openstapps/minimal-deployment](https://gitlab.com/openstapps/minimal-deployment) | 3 |
|
||||
| __[Easy access for connector developers](https://gitlab.com/openstapps/minimal-connector/issues/3)__<br />__Labels:__ meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/minimal-connector/merge_requests/3) | [openstapps/minimal-connector](https://gitlab.com/openstapps/minimal-connector) | 5 |
|
||||
| __[Provide context based search](https://gitlab.com/openstapps/backend/issues/11)__<br />__Labels:__ feature, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/backend/merge_requests/12) | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
|
||||
| __[Do not exclude externals from reflection](https://gitlab.com/openstapps/core-tools/issues/7)__<br />__Labels:__ meeting | | [openstapps/core-tools](https://gitlab.com/openstapps/core-tools) | 9 |
|
||||
| __[UML generation for data models](https://gitlab.com/openstapps/core-tools/issues/3)__<br />__Labels:__ Doing, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/core-tools/merge_requests/2) | [openstapps/core-tools](https://gitlab.com/openstapps/core-tools) | 10 |
|
||||
| __[Unclear documentation](https://gitlab.com/openstapps/projectmanagement/issues/6)__<br />__Labels:__ meeting | | [openstapps/projectmanagement](https://gitlab.com/openstapps/projectmanagement) | 15 |
|
||||
## <img src="https://assets.gitlab-static.net/uploads/-/system/user/avatar/3203752/avatar.png" height="30"/> Sebastian Lange
|
||||
|
||||
### open: 5, closed: 2
|
||||
|
||||
quota closed: 28%
|
||||
|
||||
| __title__ | __status__ | __project__ | __weeks__ |
|
||||
| --- | --- | --- | --- |
|
||||
| __[Follow-up from "Resolve "Config module - Provider for app configuration""](https://gitlab.com/openstapps/app/issues/41)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 0 |
|
||||
| __[Config module - Provider for app configuration](https://gitlab.com/openstapps/app/issues/34)__<br />__Labels:__ feature, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/app/merge_requests/5) | [openstapps/app](https://gitlab.com/openstapps/app) | 7 |
|
||||
| __[Initialize settings with from backend served app configuration](https://gitlab.com/openstapps/app/issues/30)__<br />__Labels:__ feature, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/app/merge_requests/7) | [openstapps/app](https://gitlab.com/openstapps/app) | 13 |
|
||||
| __[Use i18n](https://gitlab.com/openstapps/app/issues/5)__<br />__Labels:__ meeting | | [openstapps/app](https://gitlab.com/openstapps/app) | 14 |
|
||||
| __[Menu module - main and context menu](https://gitlab.com/openstapps/app/issues/3)__<br />__Labels:__ meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/app/merge_requests/9) | [openstapps/app](https://gitlab.com/openstapps/app) | 14 |
|
||||
| __[Update core dependency to v0.12.0](https://gitlab.com/openstapps/backend/issues/30)__<br />__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 0 |
|
||||
| __[Remodeling of Buckets in SCFacets](https://gitlab.com/openstapps/core/issues/42)__<br />__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 1 |
|
||||
## <img src="https://secure.gravatar.com/avatar/5bd48fb0ae000b24b1d1455d9c160364?s=80&d=identicon" height="30"/> Wieland Schöbl
|
||||
|
||||
### open: 17, closed: 1
|
||||
|
||||
quota closed: 5%
|
||||
|
||||
| __title__ | __status__ | __project__ | __weeks__ |
|
||||
| --- | --- | --- | --- |
|
||||
| __[SCIndexResponse: additionalProperty "uid" exists in instance when not allowed](https://gitlab.com/openstapps/backend/issues/32)__<br />__Labels:__ __bug__, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 0 |
|
||||
| __[There are still occcurences of `isProductiveEnvironment`](https://gitlab.com/openstapps/backend/issues/29)__<br />__Labels:__ __bug__, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/backend/merge_requests/11) | [openstapps/backend](https://gitlab.com/openstapps/backend) | 0 |
|
||||
| __[Refactoring of search (query building)](https://gitlab.com/openstapps/backend/issues/13)__<br />__Labels:__ __bug__, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
|
||||
| __[Backend should throw an Error if someone tries to close an empty bulk process](https://gitlab.com/openstapps/backend/issues/7)__<br />__Labels:__ __bug__, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
|
||||
| __[Implement unit tests](https://gitlab.com/openstapps/backend/issues/31)__<br />__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 0 |
|
||||
| __[Add better documentation](https://gitlab.com/openstapps/backend/issues/26)__<br />__Labels:__ feature, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/backend/merge_requests/7) | [openstapps/backend](https://gitlab.com/openstapps/backend) | 2 |
|
||||
| __[Automatically check database version](https://gitlab.com/openstapps/backend/issues/24)__<br />__Labels:__ feature, meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/backend/merge_requests/6) | [openstapps/backend](https://gitlab.com/openstapps/backend) | 3 |
|
||||
| __[Publish documentation to gitlab pages](https://gitlab.com/openstapps/backend/issues/22)__<br />__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 3 |
|
||||
| __[backend version should be provided by the requested path instead of the `X-StApps-Version` header](https://gitlab.com/openstapps/proxy/issues/2)__<br />__Labels:__ meeting | | [openstapps/proxy](https://gitlab.com/openstapps/proxy) | 3 |
|
||||
| __[Dynamic Data should be accesible by the search route as well](https://gitlab.com/openstapps/backend/issues/17)__<br />__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
|
||||
| __[Link documentation for routes in the README.ms](https://gitlab.com/openstapps/backend/issues/10)__<br />__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
|
||||
| __[Develop a monitoring solution for backend load](https://gitlab.com/openstapps/backend/issues/9)__<br />__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
|
||||
| __[Aggregations for the first letters of search results](https://gitlab.com/openstapps/backend/issues/6)__<br />__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
|
||||
| __[Boosting of academic terms should be done dynamically](https://gitlab.com/openstapps/backend/issues/4)__<br />__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 8 |
|
||||
| __[Develop a new plugin structure that registers plugins via HTTP](https://gitlab.com/openstapps/backend/issues/2)__<br />__Labels:__ feature, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 9 |
|
||||
| __[Elasticsearch Mapping files should be generated from the StAppsCore schema](https://gitlab.com/openstapps/core-tools/issues/6)__<br />__Labels:__ meeting | <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>](https://gitlab.com/openstapps/core-tools/merge_requests/8) | [openstapps/core-tools](https://gitlab.com/openstapps/core-tools) | 9 |
|
||||
| __[Add model for routes that register backend plugins](https://gitlab.com/openstapps/core/issues/15)__<br />__Labels:__ feature, meeting | | [openstapps/core](https://gitlab.com/openstapps/core) | 14 |
|
||||
| __[Closing a bulk fails for SCThingTypes that contain a space character](https://gitlab.com/openstapps/backend/issues/25)__<br />__Labels:__ __bug__, meeting | | [openstapps/backend](https://gitlab.com/openstapps/backend) | 3 |
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2018 StApps
|
||||
* Copyright (C) 2018, 2019 StApps
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, version 3.
|
||||
@@ -20,9 +20,11 @@ import {readFile, unlink, writeFile} from 'fs';
|
||||
import * as glob from 'glob';
|
||||
import {promisify} from 'util';
|
||||
|
||||
/**
|
||||
* Instantiated logger
|
||||
*/
|
||||
export const readFilePromisified = promisify(readFile);
|
||||
export const globPromisified = promisify(glob);
|
||||
export const writeFilePromisified = promisify(writeFile);
|
||||
export const unlinkPromisified = promisify(unlink);
|
||||
|
||||
export const logger = new Logger();
|
||||
|
||||
/**
|
||||
@@ -65,20 +67,3 @@ export async function getSubGroups(api: Api, groups: number[]): Promise<Group[]>
|
||||
export function flatten2dArray<T>(arr: T[][]): T[] {
|
||||
return ([] as T[]).concat(...arr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Promisified version of readFile
|
||||
*/
|
||||
export const readFilePromisified = promisify(readFile);
|
||||
/**
|
||||
* Promisified version of glob
|
||||
*/
|
||||
export const globPromisified = promisify(glob);
|
||||
/**
|
||||
* Promisified version of writeFile
|
||||
*/
|
||||
export const writeFilePromisified = promisify(writeFile);
|
||||
/**
|
||||
* Promisified version of unlink
|
||||
*/
|
||||
export const unlinkPromisified = promisify(unlink);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2018 StApps
|
||||
* Copyright (C) 2018, 2019 StApps
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, version 3.
|
||||
@@ -15,15 +15,61 @@
|
||||
import {Api} from '@openstapps/gitlab-api';
|
||||
import {Issue, IssueState, MembershipScope, MergeRequestState, Project, User} from '@openstapps/gitlab-api/lib/types';
|
||||
import {asyncPool} from 'async-pool-native/dist/async-pool';
|
||||
import {readFileSync, writeFile} from 'fs';
|
||||
import * as moment from 'moment';
|
||||
import {join} from 'path';
|
||||
import {render} from 'mustache';
|
||||
import {join, resolve} from 'path';
|
||||
import {cwd} from 'process';
|
||||
import {promisify} from 'util';
|
||||
import {flatten2dArray, getProjects, getSubGroups, logger} from '../common';
|
||||
import {flatten2dArray, getProjects, logger, readFilePromisified, writeFilePromisified} from '../common';
|
||||
import {BOLD_LABELS, GROUPS, LABEL_WEIGHTS} from '../configuration';
|
||||
|
||||
const asyncWriteFile = promisify(writeFile);
|
||||
/**
|
||||
* A structure for template compilation
|
||||
*/
|
||||
export interface StructureForTemplate {
|
||||
issuesByAssignee: AssigneeWithIssues[];
|
||||
meetingDay: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* A map
|
||||
*/
|
||||
export interface IssuesGroupedByAssigneeId {
|
||||
[assigneeId: number]: AssigneeWithIssues;
|
||||
}
|
||||
|
||||
/**
|
||||
* An assignee with assigned issues
|
||||
*/
|
||||
export interface AssigneeWithIssues {
|
||||
assignee: User;
|
||||
issueCounts: {
|
||||
closed: number;
|
||||
opened: number;
|
||||
};
|
||||
issues: IssueWithMeta[];
|
||||
quota: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Issue with meta information
|
||||
*/
|
||||
export interface IssueWithMeta extends Issue {
|
||||
$branchExists: boolean;
|
||||
$labels: string;
|
||||
$mergeRequestUrl: string;
|
||||
$project: string;
|
||||
$weeksOpen: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge request data
|
||||
*/
|
||||
export interface MergeRequestsForProjects {
|
||||
[projectId: string]: Array<{
|
||||
issue_iid: number;
|
||||
web_url: string;
|
||||
}>;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if issue state is opened or closed
|
||||
@@ -41,8 +87,7 @@ export function issueStateIsOpenedOrClosed(state: IssueState): state is IssueSta
|
||||
* @param projectId Project ID to get data about merge requests for
|
||||
* @param issueIid Issue IID in certain project (relative ID, and not issue's GitLab API ID)
|
||||
*/
|
||||
|
||||
export function getMergeRequestUrls(projectMergeRequests: MergeRequestData,
|
||||
export function getMergeRequestUrls(projectMergeRequests: MergeRequestsForProjects,
|
||||
projectId: number,
|
||||
issueIid: number): string[] {
|
||||
if (typeof projectMergeRequests[projectId] === 'undefined' || projectMergeRequests[projectId].length === 0) {
|
||||
@@ -56,72 +101,15 @@ export function getMergeRequestUrls(projectMergeRequests: MergeRequestData,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* An assignee with his/her issues
|
||||
*/
|
||||
export interface AssigneeWithIssues {
|
||||
assignee: User;
|
||||
issueCounts: {
|
||||
closed: number;
|
||||
opened: number;
|
||||
};
|
||||
issues: Issue[];
|
||||
quota: number;
|
||||
}
|
||||
|
||||
export interface MergeRequestData {
|
||||
[k: string]: Array<{
|
||||
issue_iid: number;
|
||||
web_url: string;
|
||||
}>;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tangular compiled template
|
||||
*/
|
||||
export type TangularCompiled = (model?: any, $?: any) => string;
|
||||
|
||||
/**
|
||||
* Convert an issue to a markdown table row
|
||||
*
|
||||
* @param issue Issue to convert
|
||||
* @param projectBranches Map of branches for project IDs
|
||||
* @param projectMergeRequests Map of merge requests for project IDs
|
||||
* @param template Template to render this issue with
|
||||
*/
|
||||
function issueToString(issue: any,
|
||||
projectBranches: any,
|
||||
projectMergeRequests: any,
|
||||
template: any): string {
|
||||
issue._labels = issue.labels.map((label: string) => {
|
||||
// print specific labels bold
|
||||
if (BOLD_LABELS.indexOf(label) >= 0) {
|
||||
label = '__' + label + '__';
|
||||
}
|
||||
|
||||
return label;
|
||||
}).join(', ');
|
||||
|
||||
/* tslint:disable: max-line-length */
|
||||
return template({
|
||||
branchExists: typeof projectBranches[issue.project_id] !== 'undefined' && projectBranches[issue.project_id].indexOf(issue.iid) >= 0,
|
||||
issue: issue,
|
||||
// take the first URL from the merge request urls array (usually if there are URLs, then there is that only one)
|
||||
mergeRequestUrl: getMergeRequestUrls(projectMergeRequests, issue.project_id, issue.iid)[0],
|
||||
project: issue.web_url.replace('https://gitlab.com/', '').split('/issues/')[0],
|
||||
weeksOpen: moment().diff(moment(issue.created_at), 'weeks'),
|
||||
});
|
||||
/* tslint:enable */
|
||||
}
|
||||
|
||||
/**
|
||||
* Get issues from all groups with a specific milestone
|
||||
*
|
||||
* @param api GitLab API to make requests with
|
||||
* @param label Label to filter by
|
||||
* @param groups List of groups to get issues for
|
||||
*/
|
||||
export async function getIssues(api: Api, label: string): Promise<Issue[]> {
|
||||
const issueResults = await asyncPool(2, GROUPS, (groupId) => {
|
||||
export async function getIssues(api: Api, label: string, groups: number[]): Promise<Issue[]> {
|
||||
const issueResults = await asyncPool(2, groups, (groupId) => {
|
||||
return api.getIssues({
|
||||
groupId: groupId,
|
||||
});
|
||||
@@ -142,7 +130,7 @@ export async function getIssues(api: Api, label: string): Promise<Issue[]> {
|
||||
* @param api GitLab API To make requests with
|
||||
* @param projects List of projects
|
||||
*/
|
||||
export async function getIdsOfIssuesWithBranchesForProjects(
|
||||
export async function getIssueBranches(
|
||||
api: Api,
|
||||
projects: Project[]): Promise<{ [k: string]: number[] }> {
|
||||
const projectBranches: { [k: string]: number[] } = {};
|
||||
@@ -164,14 +152,28 @@ export async function getIdsOfIssuesWithBranchesForProjects(
|
||||
}
|
||||
|
||||
/**
|
||||
* Group a list of issues by their assignees
|
||||
* Get issues grouped by assignees
|
||||
*
|
||||
* @param issues List of issues to group
|
||||
* @param api GitLab API to make requests with
|
||||
* @param label Label to generate report for
|
||||
*/
|
||||
export function groupIssuesByAssignee(issues: Issue[]): { [k: number]: AssigneeWithIssues } {
|
||||
const issuesByAssignee: {
|
||||
[k: number]: AssigneeWithIssues;
|
||||
} = {};
|
||||
export async function getIssuesGroupedByAssignees(api: Api, label: string): Promise<AssigneeWithIssues[]> {
|
||||
const issuesByAssignee: IssuesGroupedByAssigneeId = {};
|
||||
|
||||
const groups = flatten2dArray(await asyncPool(2, GROUPS, async (groupId) => {
|
||||
return (await api.getSubGroupsForGroup(groupId)).map((group) => {
|
||||
return group.id;
|
||||
});
|
||||
}));
|
||||
groups.push.apply(groups, GROUPS);
|
||||
|
||||
const [issues, projects] = await Promise.all([
|
||||
getIssues(api, label, groups),
|
||||
getProjects(api, groups),
|
||||
]);
|
||||
|
||||
const issueBranches = await getIssueBranches(api, projects);
|
||||
const mergeRequests = await getMergeRequests(api, projects);
|
||||
|
||||
issues.forEach((issue) => {
|
||||
if (issue.assignee === null) {
|
||||
@@ -195,12 +197,33 @@ export function groupIssuesByAssignee(issues: Issue[]): { [k: number]: AssigneeW
|
||||
issue.state = IssueState.OPENED;
|
||||
}
|
||||
|
||||
const issueWithMeta: IssueWithMeta = {
|
||||
...issue,
|
||||
...{
|
||||
$branchExists: typeof issueBranches[issue.project_id] !== 'undefined'
|
||||
&& issueBranches[issue.project_id].indexOf(issue.iid) >= 0,
|
||||
$issue: issue,
|
||||
$labels: issue.labels.map((issueLabel: string) => {
|
||||
// print specific labels bold
|
||||
if (BOLD_LABELS.indexOf(issueLabel) >= 0) {
|
||||
issueLabel = '__' + issueLabel + '__';
|
||||
}
|
||||
|
||||
return issueLabel;
|
||||
}).join(', '),
|
||||
$mergeRequestUrl: getMergeRequestUrls(mergeRequests, issue.project_id, issue.iid)[0],
|
||||
$project: issue.web_url.replace('https://gitlab.com/', '').split('/issues/')[0],
|
||||
$weeksOpen: moment().diff(moment(issue.created_at), 'weeks'),
|
||||
},
|
||||
};
|
||||
|
||||
if (issueStateIsOpenedOrClosed(issue.state)) {
|
||||
issuesByAssignee[issue.assignee.id].issueCounts[issue.state]++;
|
||||
issuesByAssignee[issue.assignee.id].issues.push(issue);
|
||||
issuesByAssignee[issue.assignee.id].issues.push(issueWithMeta);
|
||||
}
|
||||
});
|
||||
|
||||
// calculate quota
|
||||
Object.keys(issuesByAssignee).forEach((_assigneeId) => {
|
||||
const assigneeId = parseInt(_assigneeId, 10);
|
||||
|
||||
@@ -211,25 +234,37 @@ export function groupIssuesByAssignee(issues: Issue[]): { [k: number]: AssigneeW
|
||||
);
|
||||
});
|
||||
|
||||
return issuesByAssignee;
|
||||
}
|
||||
// sort issues by weight of labels and status
|
||||
Object.keys(issuesByAssignee).forEach((_assigneeId) => {
|
||||
const assigneeId = parseInt(_assigneeId, 10);
|
||||
|
||||
/**
|
||||
* Compile templates
|
||||
*/
|
||||
export function compileTemplates(): { [k: string]: TangularCompiled } {
|
||||
const tangular: { compile: (template: string) => TangularCompiled } = require('tangular');
|
||||
issuesByAssignee[assigneeId].issues.sort((a, b) => {
|
||||
let weightA = 0;
|
||||
let weightB = 0;
|
||||
|
||||
const templates = {
|
||||
assigneeFooter: tangular.compile(readFileSync('templates/md/assigneeFooter.md').toString()),
|
||||
assigneeHeader: tangular.compile(readFileSync('templates/md/assigneeHeader.md').toString()),
|
||||
header: tangular.compile(readFileSync('templates/md/header.md').toString()),
|
||||
issue: tangular.compile(readFileSync('templates/md/issue.md').toString()),
|
||||
};
|
||||
Object.keys(LABEL_WEIGHTS).forEach((issueLabel) => {
|
||||
if (a.labels.indexOf(issueLabel) >= 0) {
|
||||
weightA += LABEL_WEIGHTS[issueLabel];
|
||||
}
|
||||
|
||||
logger.log('Compiled templates.');
|
||||
if (b.labels.indexOf(issueLabel) >= 0) {
|
||||
weightB += LABEL_WEIGHTS[issueLabel];
|
||||
}
|
||||
});
|
||||
|
||||
return templates;
|
||||
if (a.state === IssueState.CLOSED) {
|
||||
weightA -= 10;
|
||||
}
|
||||
|
||||
if (b.state === IssueState.CLOSED) {
|
||||
weightB -= 10;
|
||||
}
|
||||
|
||||
return weightB - weightA;
|
||||
});
|
||||
});
|
||||
|
||||
return Object.values(issuesByAssignee);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -261,9 +296,9 @@ export function getNextMeetingDay() {
|
||||
* @param api GitLab API to make requests with
|
||||
* @param projects List of projects
|
||||
*/
|
||||
export async function getMergeRequestsForProjects(api: Api,
|
||||
projects: Project[]): Promise<MergeRequestData> {
|
||||
const projectMergeRequests: MergeRequestData = {};
|
||||
export async function getMergeRequests(api: Api,
|
||||
projects: Project[]): Promise<MergeRequestsForProjects> {
|
||||
const projectMergeRequests: MergeRequestsForProjects = {};
|
||||
|
||||
// iterate over projects
|
||||
await asyncPool(2, projects, async (project) => {
|
||||
@@ -292,72 +327,41 @@ export async function getMergeRequestsForProjects(api: Api,
|
||||
return projectMergeRequests;
|
||||
}
|
||||
|
||||
export async function generateReport(api: Api, label: string): Promise<string> {
|
||||
const templates = compileTemplates();
|
||||
/**
|
||||
* Generate a report
|
||||
*
|
||||
* @param api GitLab API to make requests with
|
||||
* @param label Label to generate report for
|
||||
* @param template Template to generate report with
|
||||
*/
|
||||
export async function generateReport(api: Api, label: string, template: string): Promise<string> {
|
||||
const issuesGroupedByAssignee = await getIssuesGroupedByAssignees(api, label);
|
||||
|
||||
const groupIds: number[] = [];
|
||||
groupIds.push.apply(groupIds, GROUPS);
|
||||
groupIds.push.apply(groupIds, (await getSubGroups(api, GROUPS)).map((group) => group.id));
|
||||
const structureForTemplate: StructureForTemplate = {
|
||||
issuesByAssignee: issuesGroupedByAssignee,
|
||||
meetingDay: getNextMeetingDay(),
|
||||
};
|
||||
|
||||
logger.log(`Getting data for ${groupIds.length} group(s).`);
|
||||
|
||||
const projects = await getProjects(api, groupIds);
|
||||
const issues = await getIssues(api, label);
|
||||
|
||||
const issuesGroupedByAssignee = groupIssuesByAssignee(issues);
|
||||
|
||||
const issueBranches = await getIdsOfIssuesWithBranchesForProjects(api, projects);
|
||||
const mergeRequests = await getMergeRequestsForProjects(api, projects);
|
||||
|
||||
let markdown = templates.header();
|
||||
|
||||
Object.keys(issuesGroupedByAssignee).forEach((_assigneeId) => {
|
||||
const assigneeId = parseInt(_assigneeId, 10);
|
||||
|
||||
markdown += templates.assigneeHeader(issuesGroupedByAssignee[assigneeId]);
|
||||
|
||||
issuesGroupedByAssignee[assigneeId].issues.sort((a, b) => {
|
||||
let weightA = 0;
|
||||
let weightB = 0;
|
||||
|
||||
Object.keys(LABEL_WEIGHTS).forEach((issueLabel) => {
|
||||
if (a.labels.indexOf(issueLabel) >= 0) {
|
||||
weightA += LABEL_WEIGHTS[issueLabel];
|
||||
}
|
||||
|
||||
if (b.labels.indexOf(issueLabel) >= 0) {
|
||||
weightB += LABEL_WEIGHTS[issueLabel];
|
||||
}
|
||||
});
|
||||
|
||||
if (a.state === IssueState.CLOSED) {
|
||||
weightA -= 10;
|
||||
}
|
||||
|
||||
if (b.state === IssueState.CLOSED) {
|
||||
weightB -= 10;
|
||||
}
|
||||
|
||||
return weightB - weightA;
|
||||
}).forEach((issue) => {
|
||||
markdown += issueToString(
|
||||
issue,
|
||||
issueBranches,
|
||||
mergeRequests,
|
||||
templates.issue,
|
||||
);
|
||||
});
|
||||
|
||||
markdown += templates.assigneeFooter(issuesGroupedByAssignee[assigneeId]);
|
||||
});
|
||||
|
||||
return markdown;
|
||||
return render(
|
||||
template,
|
||||
structureForTemplate,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a markdown report
|
||||
*
|
||||
* @param api GitLab API to make requests with
|
||||
* @param label Label to generate report for
|
||||
*/
|
||||
export async function report(api: Api, label: string) {
|
||||
const meetingDay = getNextMeetingDay();
|
||||
|
||||
const markdown = generateReport(api, label);
|
||||
const markdown = await generateReport(
|
||||
api,
|
||||
label,
|
||||
(await readFilePromisified(resolve(__dirname, '..', '..', 'templates', 'report.md.mustache'))).toString(),
|
||||
);
|
||||
|
||||
let filename = join(cwd(), 'reports', meetingDay + '.md');
|
||||
|
||||
@@ -365,7 +369,7 @@ export async function report(api: Api, label: string) {
|
||||
filename = join(cwd(), 'reports', `${label}.md`);
|
||||
}
|
||||
|
||||
await asyncWriteFile(filename, markdown);
|
||||
await writeFilePromisified(filename, markdown);
|
||||
|
||||
logger.ok(`Wrote file '${filename}'.`);
|
||||
}
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
## <img src="{{ assignee.avatar_url }}" height="30" /> {{ assignee.name }}
|
||||
|
||||
### open: {{ issueCounts.opened }}, closed: {{ issueCounts.closed }}
|
||||
|
||||
quota closed: {{ quota }}%
|
||||
|
||||
| __title__ | __status__ | __project__ | __weeks__ |
|
||||
| --- | --- | --- | --- |
|
||||
@@ -1 +0,0 @@
|
||||
# Meeting {{ meetingDay }}
|
||||
@@ -1 +0,0 @@
|
||||
| __[{{ if issue.state !== 'closed' }} {{ issue.title }} {{ else }} ~~{{ issue.title }}~~ {{ fi }}]({{ issue.web_url }})__<br />__Labels:__ {{ issue._labels }} | {{ if branchExists }} <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" /> {{ fi}} {{ if mergeRequestUrl !== undefined }} <a href="{{ mergeRequestUrl }}"> <img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/> </a> {{ fi }} | [{{ project }}](https://gitlab.com/{{ project }}) | {{ weeksOpen }} |
|
||||
14
templates/report.md.mustache
Normal file
14
templates/report.md.mustache
Normal file
@@ -0,0 +1,14 @@
|
||||
# Meeting {{meetingDay}}
|
||||
|
||||
{{#issuesByAssignee}}
|
||||
## {{#assignee.avatar_url}}<img src="{{&assignee.avatar_url}}" height="30"/> {{/assignee.avatar_url}}{{assignee.name}}
|
||||
|
||||
### open: {{issueCounts.opened}}, closed: {{issueCounts.closed}}
|
||||
|
||||
quota closed: {{quota}}%
|
||||
|
||||
| __title__ | __status__ | __project__ | __weeks__ |
|
||||
| --- | --- | --- | --- |
|
||||
{{#issues}}| __[{{title}}]({{&web_url}})__<br />__Labels:__ {{$labels}} | {{#$branchExists}}<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-branch-512.png" height="30" />{{/$branchExists}}{{#$mergeRequestUrl}}[<img src="https://cdn0.iconfinder.com/data/icons/octicons/1024/git-merge-512.png" height="30"/>]({{&$mergeRequestUrl}}){{/$mergeRequestUrl}} | [{{$project}}](https://gitlab.com/{{&$project}}) | {{$weeksOpen}} |
|
||||
{{/issues}}
|
||||
{{/issuesByAssignee}}
|
||||
Reference in New Issue
Block a user