1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00
This commit is contained in:
Rohan Verma 2018-07-20 12:15:28 +05:30
commit c44a0773cb
180 changed files with 4356 additions and 996 deletions

View File

@ -217,6 +217,34 @@
"name": "Jagdeep Singh",
"avatar_url": "https://avatars3.githubusercontent.com/u/3717137?v=4",
"profile": "https://jagdeep.me",
"contributions": []
},
{
"login": "darkSasori",
"name": "Lineu Felipe",
"avatar_url": "https://avatars0.githubusercontent.com/u/889171?v=4",
"profile": "https://github.com/darkSasori",
"contributions": []
},
{
"login": "kvj",
"name": "Konstantin",
"avatar_url": "https://avatars2.githubusercontent.com/u/159124?v=4",
"profile": "https://github.com/kvj",
"contributions": []
},
{
"login": "brendano86",
"name": "Brendan O'Leary",
"avatar_url": "https://avatars2.githubusercontent.com/u/6044920?v=4",
"profile": "http://www.brendanoleary.com",
"contributions": []
},
{
"login": "bertl4398",
"name": "bertl4398",
"avatar_url": "https://avatars2.githubusercontent.com/u/1226441?v=4",
"profile": "https://github.com/bertl4398",
"contributions": [
]
}

2
.gitignore vendored
View File

@ -16,6 +16,8 @@
.DS_Store
gcal/client_secret.json
gspreadsheets/client_secret.json
profile.pdf
#intellij idea
.idea/

30
Gopkg.lock generated
View File

@ -4,8 +4,8 @@
[[projects]]
name = "cloud.google.com/go"
packages = ["compute/metadata"]
revision = "777200caa7fb8936aed0f12b1fd79af64cc83ec9"
version = "v0.24.0"
revision = "aad3f485ee528456e0768f20397b4d9dd941e755"
version = "v0.25.0"
[[projects]]
branch = "master"
@ -25,6 +25,12 @@
packages = ["."]
revision = "6a9abf92e34f4de62ac671caee3143f10b98892d"
[[projects]]
branch = "master"
name = "github.com/darkSasori/todoist"
packages = ["."]
revision = "ec6b38b374ab9c60cc9716d2083ae66eb9383d03"
[[projects]]
name = "github.com/davecgh/go-spew"
packages = ["spew"]
@ -38,13 +44,13 @@
revision = "b23993cbb6353f0e6aa98d0ee318a34728f628b9"
[[projects]]
branch = "master"
name = "github.com/gdamore/tcell"
packages = [
".",
"terminfo"
]
revision = "061d51a604c546b48e92253cb65190d76cecf4c6"
version = "v1.0.0"
revision = "de7e78efa4a71b3f36c7154989c529dbdf9ae623"
[[projects]]
name = "github.com/golang/protobuf"
@ -56,7 +62,7 @@
branch = "master"
name = "github.com/google/go-github"
packages = ["github"]
revision = "60d040d2dafa18fa3e86cbf22fbc3208ef9ef1e0"
revision = "c0b63e2f9bb198baf328c8abf1ddcbe05ff9427e"
[[projects]]
branch = "master"
@ -94,6 +100,12 @@
revision = "645ef00459ed84a119197bfb8d8205042c6df63d"
version = "v0.8.0"
[[projects]]
name = "github.com/pkg/profile"
packages = ["."]
revision = "5b67d428864e92711fcbd2f8629456121a56d91f"
version = "v1.2.1"
[[projects]]
name = "github.com/pmezard/go-difflib"
packages = ["difflib"]
@ -110,7 +122,7 @@
branch = "master"
name = "github.com/rivo/tview"
packages = ["."]
revision = "83483397e826c343edb7b8c1f33fb7983dda9fc5"
revision = "c33dd0cf8ef840e1c8905c838d5b1ce93050a825"
[[projects]]
name = "github.com/stretchr/testify"
@ -122,7 +134,7 @@
branch = "master"
name = "github.com/xanzy/go-gitlab"
packages = ["."]
revision = "6ada444068f460636db26ca0dd66cf2aa518fa8f"
revision = "fb3ece09ef3e80cfa5c1e52dc75fcfb56c12e026"
[[projects]]
branch = "master"
@ -143,7 +155,7 @@
"context",
"context/ctxhttp"
]
revision = "e514e69ffb8bc3c76a71ae40de0118d794855992"
revision = "8887df42c721e930089d31b28391090a10a497d7"
[[projects]]
branch = "master"
@ -179,7 +191,7 @@
"googleapi/internal/uritemplates",
"sheets/v4"
]
revision = "082d671a2a341aa205b22b580fa69747dcc3cdc8"
revision = "efcb5f25ac56eae06c8b5672456c0b7767522685"
[[projects]]
name = "google.golang.org/appengine"

View File

@ -31,11 +31,11 @@
[[constraint]]
name = "github.com/gdamore/tcell"
version = "1.0.0"
branch = "master"
[[constraint]]
name = "github.com/go-test/deep"
version = "1.0.1"
#[[constraint]]
#name = "github.com/go-test/deep"
#version = "1.0.1"
[[constraint]]
name = "github.com/google/go-github"
@ -54,36 +54,40 @@
version = "1.4.0"
[[constraint]]
branch = "master"
name = "github.com/olebedev/config"
branch = "master"
[[constraint]]
name = "github.com/radovskyb/watcher"
version = "1.0.2"
[[constraint]]
branch = "master"
name = "github.com/rivo/tview"
branch = "master"
[[constraint]]
branch = "master"
name = "github.com/yfronto/newrelic"
branch = "master"
[[constraint]]
branch = "master"
name = "golang.org/x/oauth2"
branch = "master"
[[constraint]]
branch = "master"
name = "google.golang.org/api"
branch = "master"
[[constraint]]
name = "gopkg.in/yaml.v2"
version = "2.2.1"
[[constraint]]
branch = "master"
name = "github.com/adlio/trello"
branch = "master"
[[constraint]]
name = "github.com/darkSasori/todoist"
branch = "master"
[prune]
go-tests = true

View File

@ -1,4 +1,4 @@
.PHONY: contrib_check dependencies install run
.PHONY: contrib_check dependencies install run size
build:
go build -o bin/wtf
@ -8,8 +8,11 @@ contrib_check:
install:
go clean
go install -ldflags="-X main.version=$(shell git describe --always --abbrev=6) -X main.date=$(shell date +%FT%T%z)"
go install -ldflags="-s -w -X main.version=$(shell git describe --always --abbrev=6) -X main.date=$(shell date +%FT%T%z)"
which wtf
run: build
bin/wtf
size:
loc --exclude vendor/ _sample_configs/ _site/ docs/ Makefile *.md *.toml

View File

@ -55,7 +55,7 @@ Thanks goes to these wonderful people:
| [<img src="https://avatars2.githubusercontent.com/u/9014288?v=4" width="48px;"/><br /><sub><b>baustinanki</b></sub>](https://github.com/baustinanki)<br /> | [<img src="https://avatars0.githubusercontent.com/u/371475?v=4" width="48px;"/><br /><sub><b>lucus lee</b></sub>](https://github.com/lixin9311)<br /> | [<img src="https://avatars1.githubusercontent.com/u/7537841?v=4" width="48px;"/><br /><sub><b>Mike Lloyd</b></sub>](https://github.com/mxplusb)<br /> | [<img src="https://avatars3.githubusercontent.com/u/10998?v=4" width="48px;"/><br /><sub><b>Sergio Rubio</b></sub>](http://rubiojr.rbel.co)<br /> | [<img src="https://avatars3.githubusercontent.com/u/17374492?v=4" width="48px;"/><br /><sub><b>Farhad Farahi</b></sub>](https://github.com/FarhadF)<br /> | [<img src="https://avatars1.githubusercontent.com/u/634604?v=4" width="48px;"/><br /><sub><b>Lasantha Kularatne</b></sub>](http://lasantha.blogspot.com/)<br /> | [<img src="https://avatars1.githubusercontent.com/u/823331?v=4" width="48px;"/><br /><sub><b>Mark Old</b></sub>](https://github.com/dlom)<br /> |
| [<img src="https://avatars0.githubusercontent.com/u/5546718?v=4" width="48px;"/><br /><sub><b>flw</b></sub>](http://flw.tools/)<br /> | [<img src="https://avatars0.githubusercontent.com/u/6024927?v=4" width="48px;"/><br /><sub><b>David Barda</b></sub>](https://github.com/davebarda)<br /> | [<img src="https://avatars2.githubusercontent.com/u/4261980?v=4" width="48px;"/><br /><sub><b>Geoff Lee</b></sub>](https://github.com/matrinox)<br /> | [<img src="https://avatars3.githubusercontent.com/u/1022918?v=4" width="48px;"/><br /><sub><b>George Opritescu</b></sub>](http://international.github.io)<br /> | [<img src="https://avatars3.githubusercontent.com/u/497310?v=4" width="48px;"/><br /><sub><b>Grazfather</b></sub>](https://twitter.com/Grazfather)<br /> | [<img src="https://avatars2.githubusercontent.com/u/1691120?v=4" width="48px;"/><br /><sub><b>Michael Cordell</b></sub>](http://www.mikecordell.com/)<br /> | [<img src="https://avatars2.githubusercontent.com/u/1215497?v=4" width="48px;"/><br /><sub><b>Patrick José Pereira</b></sub>](http://patrick.ibexcps.com)<br /> |
| [<img src="https://avatars2.githubusercontent.com/u/1483092?v=4" width="48px;"/><br /><sub><b>sherod taylor</b></sub>](https://github.com/sherodtaylor)<br /> | [<img src="https://avatars2.githubusercontent.com/u/3062663?v=4" width="48px;"/><br /><sub><b>Andrew Scott</b></sub>](http://cogentia.io)<br /> | [<img src="https://avatars2.githubusercontent.com/u/3252403?v=4" width="48px;"/><br /><sub><b>Anand Sudhir Prayaga</b></sub>](https://github.com/anandsudhir)<br /> | [<img src="https://avatars1.githubusercontent.com/u/12018440?v=4" width="48px;"/><br /><sub><b>Lassi Piironen</b></sub>](https://github.com/lsipii)<br /> | [<img src="https://avatars0.githubusercontent.com/u/14799210?v=4" width="48px;"/><br /><sub><b>BlackWebWolf</b></sub>](https://github.com/BlackWebWolf)<br /> | [<img src="https://avatars0.githubusercontent.com/u/1894885?v=4" width="48px;"/><br /><sub><b>andrewzolotukhin</b></sub>](https://github.com/andrewzolotukhin)<br /> | [<img src="https://avatars1.githubusercontent.com/u/8568280?v=4" width="48px;"/><br /><sub><b>Leon Stigter</b></sub>](https://retgits.github.io)<br /> |
| [<img src="https://avatars3.githubusercontent.com/u/21756?v=4" width="48px;"/><br /><sub><b>Amr Tamimi</b></sub>](https://tamimi.se)<br /> | [<img src="https://avatars3.githubusercontent.com/u/3717137?v=4" width="48px;"/><br /><sub><b>Jagdeep Singh</b></sub>](https://jagdeep.me)<br /> |
| [<img src="https://avatars3.githubusercontent.com/u/21756?v=4" width="48px;"/><br /><sub><b>Amr Tamimi</b></sub>](https://tamimi.se)<br /> | [<img src="https://avatars3.githubusercontent.com/u/3717137?v=4" width="48px;"/><br /><sub><b>Jagdeep Singh</b></sub>](https://jagdeep.me)<br /> | [<img src="https://avatars0.githubusercontent.com/u/889171?v=4" width="48px;"/><br /><sub><b>Lineu Felipe</b></sub>](https://github.com/darkSasori)<br /> | [<img src="https://avatars2.githubusercontent.com/u/159124?v=4" width="48px;"/><br /><sub><b>Konstantin</b></sub>](https://github.com/kvj)<br /> | [<img src="https://avatars2.githubusercontent.com/u/6044920?v=4" width="48px;"/><br /><sub><b>Brendan O'Leary</b></sub>](http://www.brendanoleary.com)<br /> | [<img src="https://avatars2.githubusercontent.com/u/1226441?v=4" width="48px;"/><br /><sub><b>bertl4398</b></sub>](https://github.com/bertl4398)<br /> |
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!

View File

@ -203,10 +203,12 @@ wtf:
width: 1
refreshInterval: 3600
weather:
apiKey: [YOUR API KEY]
# From http://openweathermap.org/help/city_list.txt
cityids:
- 3370352
- 1283240
WTF_OWM_API_KEY: [YOUR API KEY]
colors:
current: "lightblue"
enabled: true

View File

@ -55,10 +55,12 @@ gerrit:
height: 2
width: 2
refreshInterval: 300
domain: https://gerrit-review.googlesource.com
projects:
- org/test-project"
- dotfiles
username: "myname"
verifyServerCertificate: false
```
### Attributes
@ -75,7 +77,7 @@ How often, in seconds, this module will update its data. <br />
Values: A positive integer, `0..n`.
`domain` <br />
_Optional_. Your Gerrit corporate domain. <br />
Your Gerrit corporate domain. <br />
Values: A valid URI.
`projects` <br />

View File

@ -61,6 +61,7 @@ wtf/github/
```yaml
github:
enabled: true
enableStatus: true
position:
top: 2
left: 3
@ -79,6 +80,11 @@ github:
Determines whether or not this module is executed and if its data displayed onscreen. <br />
Values: `true`, `false`.
`enableStatus` <br />
Display pull request mergeability status ('dirty', 'clean', 'unstable',
'blocked').<br />
Values: `true`, `false`.
`position` <br />
Defines where in the grid this module's widget will be displayed. <br />

View File

@ -1,5 +1,5 @@
---
title: "Gitlab"
title: "GitLab"
date: 2018-06-08T13:14:11-07:00
draft: false
---
@ -8,7 +8,7 @@ Added in `v0.0.8`.
<img src="/imgs/modules/gitlab.png" width="640" height="384" alt="gitlab screenshot" />
Displays information about your projects hosted on Gitlab:
Displays information about your projects hosted on GitLab:
#### Open Approval Requests
@ -27,7 +27,7 @@ wtf/gitlab/
## Required ENV Variables
<span class="caption">Key:</span> `WTF_GITLAB_TOKEN` <br />
<span class="caption">Action:</span> A <a href="https://docs.gitlab.com/ce/user/profile/personal_access_tokens.html">Gitlab personal access token</a>. Requires at least `api` access.
<span class="caption">Action:</span> A <a href="https://docs.gitlab.com/ce/user/profile/personal_access_tokens.html">GitLab personal access token</a>. Requires at least `api` access.
## Keyboard Commands
@ -77,14 +77,14 @@ How often, in seconds, this module will update its data. <br />
Values: A positive integer, `0..n`.
`domain` <br />
_Optional_. Your Gitlab corporate domain. <br />
_Optional_. Your GitLab corporate domain. <br />
Values: A valid URI.
`projects` <br />
A list of key/value pairs each describing a Gitlab project to fetch data
A list of key/value pairs each describing a GitLab project to fetch data
for. <br />
<span class="caption">Key:</span> The name of the project. <br />
<span class="caption">Value:</span> The namespace of the project.
`username` <br />
Your Gitlab username. Used to figure out which requests require your approval
Your GitLab username. Used to figure out which requests require your approval

View File

@ -39,6 +39,7 @@ jenkins:
refreshInterval: 300
url: "https://jenkins.domain.com/jenkins/view_url"
user: "username"
verifyServerCertificate: true
```
### Attributes
@ -61,3 +62,7 @@ Your Jenkins username. <br />
The url to your Jenkins project or view. <br />
Values: A valid URI.
`verifyServerCertificate` <br />
_Optional_ <br />
Determines whether or not the server's certificate chain and host name are verified. <br />
Values: `true`, `false`.

View File

@ -21,7 +21,20 @@ wtf/jira/
## Keyboard Commands
None.
<span class="caption">Key:</span> `[return]` <br />
<span class="caption">Action:</span> Open the selected issue in the browser.
<span class="caption">Key:</span> `j` <br />
<span class="caption">Action:</span> Select the next item in the list.
<span class="caption">Key:</span> `k` <br />
<span class="caption">Action:</span> Select the previous item in the list.
<span class="caption">Key:</span> `↓` <br />
<span class="caption">Action:</span> Select the next item in the list.
<span class="caption">Key:</span> `↑` <br />
<span class="caption">Action:</span> Select the previous item in the list.
## Configuration

View File

@ -0,0 +1,91 @@
---
title: "Todoist"
date: 2018-07-05T22:55:55-03:00
draft: false
---
Added in `v0.0.11`.
Displays all items on specified project.
<img src="/imgs/modules/todoist.png" alt="todoist screenshot" />
## Source Code
```bash
wtf/todoist/
```
## Required ENV Variables
<span class="caption">Key:</span> `WTF_TODOIST_TOKEN` <br />
<span class="caption">Value:</span> Your Todoist API Token. <br />
_You can get your API Token at: todoist.com/prefs/integrations._
## Keyboard Commands
<span class="caption">Key:</span> `h` <br />
<span class="caption">Action:</span> Show the previous project.
<span class="caption">Key:</span> `←` <br />
<span class="caption">Action:</span> Show the previous project.
<span class="caption">Key:</span> `l` <br />
<span class="caption">Action:</span> Show the next project.
<span class="caption">Key:</span> `→` <br />
<span class="caption">Action:</span> Show the next project.
<span class="caption">Key:</span> `j` <br />
<span class="caption">Action:</span> Select the next item in the list.
<span class="caption">Key:</span> `↓` <br />
<span class="caption">Action:</span> Select the next item in the list.
<span class="caption">Key:</span> `k` <br />
<span class="caption">Action:</span> Select the previous item in the list.
<span class="caption">Key:</span> `↑` <br />
<span class="caption">Action:</span> Select the previous item in the list.
<span class="caption">Key:</span> `c` <br />
<span class="caption">Action:</span> Close current item.
<span class="caption">Key:</span> `d` <br />
<span class="caption">Action:</span> Delete current item.
<span class="caption">Key:</span> `r` <br />
<span class="caption">Action:</span> Reload all projects.
## Configuration
```yaml
todoist:
enabled: true
position:
top: 0
left: 2
height: 1
width: 1
projects:
- 122247497
refreshInterval: 3600
```
### Attributes
`enabled` <br />
Determines whether or not this module is executed and if its data displayed onscreen. <br />
Values: `true`, `false`.
`position` <br />
Where in the grid this module's widget will be displayed. <br />
`projects` <br />
The todoist projects to fetch items from. <br />
Values: The integer ID of the project.
`refreshInterval` <br />
How often, in seconds, this module will update its data. <br />
Values: A positive integer, `0..n`.

View File

@ -0,0 +1,52 @@
---
title: "TravisCI"
date: 2018-07-18T14:36:08-04:00
draft: false
---
Added in `v0.0.12`.
Displays build information for your Travis CI account.
<img src="/imgs/modules/travisci.png" width="609" height="150" alt="travisci screenshot" />
## Source Code
```bash
wtf/travisci/
```
## Required ENV Variables
<span class="caption">Key:</span> `WTF_TRAVIS_API_TOKEN` <br />
<span class="caption">Value:</span> Your <a href="https://developer.travis-ci.org/authentication">Travis CI API</a> access token.
## Keyboard Commands
None.
## Configuration
```yaml
travisci:
enabled: true
position:
top: 4
left: 1
height: 1
width: 2
refreshInterval: 900
```
### Attributes
`enabled` <br />
Determines whether or not this module is executed and if its data displayed onscreen. <br />
Values: `true`, `false`.
`position` <br />
Defines where in the grid this module's widget will be displayed. <br />
`refreshInterval` <br />
How often, in seconds, this module will update its data. <br />
Values: A positive integer, `0..n`.

View File

@ -17,8 +17,11 @@ wtf/weather/
## Required ENV Variables
<span class="caption">Key:</span> `WTF_OWM_API_KEY` <br />
<span class="caption">Action:</span> Your <a href="https://openweathermap.org/appid">OpenWeatherMap API</a> key.
<span class="caption">Action:</span> Your <a href="https://openweathermap.org/appid">OpenWeatherMap API</a> key. <br />
<span class="caption">Note:</span> DEPRECATED. See the `apiKey` config value, below.
## Keyboard Commands
@ -41,6 +44,7 @@ wtf/weather/
```yaml
weather:
apiKey: "2dfb3e3650a1950adddb6badf5ba1aaa"
# From http://openweathermap.org/help/city_list.txt
cityids:
- 6173331
@ -62,6 +66,9 @@ weather:
### Attributes
`apiKey` <br />
Your <a href="https://openweathermap.org/appid">OpenWeatherMap API</a> key.
`cityids` <br />
A list of the <a
href="http://openweathermap.org/help/city_list.txt">OpenWeatherMap city

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@ -32,7 +32,7 @@
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -47,6 +47,8 @@
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

187
checklist/checklist.go Normal file
View File

@ -0,0 +1,187 @@
package checklist
// Checklist is a module for creating generic checklist implementations
// See 'Todo' for an implementation example
type Checklist struct {
Selected int
Items []*ChecklistItem
}
func NewChecklist() Checklist {
list := Checklist{
Selected: -1,
}
return list
}
/* -------------------- Exported Functions -------------------- */
// Add creates a new item in the checklist
func (list *Checklist) Add(checked bool, text string) {
item := ChecklistItem{
Checked: checked,
Text: text,
}
list.Items = append([]*ChecklistItem{&item}, list.Items...)
}
// CheckedItems returns a slice of all the checked items
func (list *Checklist) CheckedItems() []*ChecklistItem {
items := []*ChecklistItem{}
for _, item := range list.Items {
if item.Checked {
items = append(items, item)
}
}
return items
}
// Delete removes the selected item from the checklist
func (list *Checklist) Delete() {
list.Items = append(list.Items[:list.Selected], list.Items[list.Selected+1:]...)
list.Prev()
}
// Demote moves the selected item down in the checklist
func (list *Checklist) Demote() {
if list.IsUnselectable() {
return
}
j := list.Selected + 1
if j >= len(list.Items) {
j = 0
}
list.Swap(list.Selected, j)
list.Selected = j
}
// IsSelectable returns true if the checklist has selectable items, false if it does not
func (list *Checklist) IsSelectable() bool {
return list.Selected >= 0 && list.Selected < len(list.Items)
}
// IsUnselectable returns true if the checklist has no selectable items, false if it does
func (list *Checklist) IsUnselectable() bool {
return !list.IsSelectable()
}
// Next selects the next item in the checklist
func (list *Checklist) Next() {
list.Selected = list.Selected + 1
if list.Selected >= len(list.Items) {
list.Selected = 0
}
}
// LongestLine returns the length of the longest checklist item's text
func (list *Checklist) LongestLine() int {
maxLen := 0
for _, item := range list.Items {
if len(item.Text) > maxLen {
maxLen = len(item.Text)
}
}
return maxLen
}
// Prev selects the previous item in the checklist
func (list *Checklist) Prev() {
list.Selected = list.Selected - 1
if list.Selected < 0 {
list.Selected = len(list.Items) - 1
}
}
// Promote moves the selected item up in the checklist
func (list *Checklist) Promote() {
if list.IsUnselectable() {
return
}
j := list.Selected - 1
if j < 0 {
j = len(list.Items) - 1
}
list.Swap(list.Selected, j)
list.Selected = j
}
// SelectedItem returns the currently-selected checklist item or nil if no item is selected
func (list *Checklist) SelectedItem() *ChecklistItem {
if list.IsUnselectable() {
return nil
}
return list.Items[list.Selected]
}
func (list *Checklist) SetSelectedByItem(selectableItem *ChecklistItem) {
for idx, item := range list.Items {
if item == selectableItem {
list.Selected = idx
break
}
}
}
// Toggle switches the checked state of the currently-selected item
func (list *Checklist) Toggle() {
if list.IsUnselectable() {
return
}
list.SelectedItem().Toggle()
}
// UncheckedItems returns a slice of all the unchecked items
func (list *Checklist) UncheckedItems() []*ChecklistItem {
items := []*ChecklistItem{}
for _, item := range list.Items {
if !item.Checked {
items = append(items, item)
}
}
return items
}
// Unselect removes the current select such that no item is selected
func (list *Checklist) Unselect() {
list.Selected = -1
}
// Update sets the text of the currently-selected item to the provided text
func (list *Checklist) Update(text string) {
item := list.SelectedItem()
if item == nil {
return
}
item.Text = text
}
/* -------------------- Sort Interface -------------------- */
func (list *Checklist) Len() int {
return len(list.Items)
}
func (list *Checklist) Less(i, j int) bool {
return list.Items[i].Text < list.Items[j].Text
}
func (list *Checklist) Swap(i, j int) {
list.Items[i], list.Items[j] = list.Items[j], list.Items[i]
}

View File

@ -0,0 +1,27 @@
package checklist
import (
"github.com/senorprogrammer/wtf/wtf"
)
// ChecklistItem is a module for creating generic checklist implementations
// See 'Todo' for an implementation example
type ChecklistItem struct {
Checked bool
Text string
}
// CheckMark returns the string used to indicate a ChecklistItem is checked or unchecked
func (item *ChecklistItem) CheckMark() string {
if item.Checked {
return wtf.Config.UString("wtf.mods.todo.checkedIcon", "x")
} else {
return " "
}
}
// Toggle changes the checked state of the ChecklistItem
// If checked, it is unchecked. If unchecked, it is checked
func (item *ChecklistItem) Toggle() {
item.Checked = !item.Checked
}

View File

@ -0,0 +1,43 @@
package wtftests
import (
"testing"
"github.com/olebedev/config"
. "github.com/senorprogrammer/wtf/checklist"
"github.com/senorprogrammer/wtf/wtf"
. "github.com/stretchr/testify/assert"
)
/* -------------------- CheckMark -------------------- */
func TestCheckMark(t *testing.T) {
loadConfig()
item := ChecklistItem{}
Equal(t, " ", item.CheckMark())
item = ChecklistItem{Checked: true}
Equal(t, "x", item.CheckMark())
}
/* -------------------- Toggle -------------------- */
func TestToggle(t *testing.T) {
loadConfig()
item := ChecklistItem{}
Equal(t, false, item.Checked)
item.Toggle()
Equal(t, true, item.Checked)
item.Toggle()
Equal(t, false, item.Checked)
}
/* -------------------- helpers -------------------- */
func loadConfig() {
wtf.Config, _ = config.ParseYamlFile("../_sample_configs/simple_config.yml")
}

View File

@ -5,6 +5,7 @@ import (
"os/exec"
"strings"
"github.com/rivo/tview"
"github.com/senorprogrammer/wtf/wtf"
)
@ -33,7 +34,7 @@ func (widget *Widget) Refresh() {
widget.UpdateRefreshedAt()
widget.execute()
title := wtf.Config.UString("wtf.mods.cmdrunner.title", widget.String())
title := tview.TranslateANSI(wtf.Config.UString("wtf.mods.cmdrunner.title", widget.String()))
widget.View.SetTitle(title)
widget.View.SetText(widget.result)
@ -46,5 +47,5 @@ func (widget *Widget) String() string {
func (widget *Widget) execute() {
cmd := exec.Command(widget.cmd, widget.args...)
widget.result = wtf.ExecuteCommand(cmd)
widget.result = tview.TranslateANSI(wtf.ExecuteCommand(cmd))
}

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -87,7 +87,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -102,6 +102,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@ -86,7 +86,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -101,6 +101,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -6,11 +6,41 @@
<description>Recent content on WTF - A Terminal Dashboard</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<lastBuildDate>Wed, 27 Jun 2018 15:55:42 -0700</lastBuildDate>
<lastBuildDate>Wed, 18 Jul 2018 14:36:08 -0400</lastBuildDate>
<atom:link href="https://wtfutil.com/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>TravisCI</title>
<link>https://wtfutil.com/posts/modules/travisci/</link>
<pubDate>Wed, 18 Jul 2018 14:36:08 -0400</pubDate>
<guid>https://wtfutil.com/posts/modules/travisci/</guid>
<description>Added in v0.0.12.
Displays build information for your Travis CI account.
Source Code wtf/travisci/ Required ENV Variables Key: WTF_TRAVIS_API_TOKEN Value: Your Travis CI API access token.
Keyboard Commands None.
Configuration travisci:enabled:trueposition:top:4left:1height:1width:2refreshInterval:900 Attributes enabled Determines whether or not this module is executed and if its data displayed onscreen. Values: true, false.
position Defines where in the grid this module&amp;rsquo;s widget will be displayed. refreshInterval How often, in seconds, this module will update its data.</description>
</item>
<item>
<title>Todoist</title>
<link>https://wtfutil.com/posts/modules/todoist/</link>
<pubDate>Thu, 05 Jul 2018 22:55:55 -0300</pubDate>
<guid>https://wtfutil.com/posts/modules/todoist/</guid>
<description>Added in v0.0.11.
Displays all items on specified project.
Source Code wtf/todoist/ Required ENV Variables Key: WTF_TODOIST_TOKEN Value: Your Todoist API Token. You can get your API Token at: todoist.com/prefs/integrations.
Keyboard Commands Key: h Action: Show the previous project.
Key: ← Action: Show the previous project.
Key: l Action: Show the next project.
Key: → Action: Show the next project.
Key: j Action: Select the next item in the list.</description>
</item>
<item>
<title>Gerrit</title>
<link>https://wtfutil.com/posts/modules/gerrit/</link>
@ -112,22 +142,22 @@ position Where in the grid this module&amp;rsquo;s widget will be displayed.</de
Displays jenkins status of given builds in a project or view
Source Code wtf/jenkins/ Required ENV Variables Key: WTF_JENKINS_API_KEY Value: Your Jenkins API key.
Keyboard Commands None.
Configuration jenkins:enabled:trueposition:top:2left:3height:2width:3refreshInterval:300url:&amp;#34;https://jenkins.domain.com/jenkins/view_url&amp;#34;user:&amp;#34;username&amp;#34; Attributes enabled Determines whether or not this module is executed and if its data displayed onscreen. Values: true, false.
Configuration jenkins:enabled:trueposition:top:2left:3height:2width:3refreshInterval:300url:&amp;#34;https://jenkins.domain.com/jenkins/view_url&amp;#34;user:&amp;#34;username&amp;#34;verifyServerCertificate:true Attributes enabled Determines whether or not this module is executed and if its data displayed onscreen. Values: true, false.
position Defines where in the grid this module&amp;rsquo;s widget will be displayed.
refreshInterval How often, in seconds, this module will update its data.</description>
</item>
<item>
<title>Gitlab</title>
<title>GitLab</title>
<link>https://wtfutil.com/posts/modules/gitlab/</link>
<pubDate>Fri, 08 Jun 2018 13:14:11 -0700</pubDate>
<guid>https://wtfutil.com/posts/modules/gitlab/</guid>
<description>Added in v0.0.8.
Displays information about your projects hosted on Gitlab:
Displays information about your projects hosted on GitLab:
Open Approval Requests All open merge requests that are requesting your approval.
Open Merge Requests All open merge requests created by you.
Source Code wtf/gitlab/ Required ENV Variables Key: WTF_GITLAB_TOKEN Action: A Gitlab personal access token. Requires at least api access.
Source Code wtf/gitlab/ Required ENV Variables Key: WTF_GITLAB_TOKEN Action: A GitLab personal access token. Requires at least api access.
Keyboard Commands Key: / Action: Open/close the widget&amp;rsquo;s help window.
Key: h Action: Show the previous project.</description>
</item>
@ -294,9 +324,11 @@ Key: j Action: Select the next item in the list.</description>
<guid>https://wtfutil.com/posts/modules/jira/</guid>
<description>Displays all Jira issues assigned to you for the specified project.
Source Code wtf/jira/ Required ENV Variables Key: WTF_JIRA_API_KEY Value: Your Jira API key.
Keyboard Commands None.
Configuration Single Jira Project jira:colors:rows:even:&amp;#34;lightblue&amp;#34;odd:&amp;#34;white&amp;#34;domain:&amp;#34;https://umbrellacorp.atlassian.net&amp;#34;email:&amp;#34;chriscummer@me.com&amp;#34;enabled:truejql:&amp;#34;issueType = Story&amp;#34;position:top:4left:1height:1width:2project:&amp;#34;ProjectA&amp;#34;refreshInterval:900username:&amp;#34;chris.cummer&amp;#34;verifyServerCertificate:true Multiple Jira Projects If you want to monitor multiple Jira projects, use the following configuration (note the difference in project):
jira:colors:rows:even:&amp;#34;lightblue&amp;#34;odd:&amp;#34;white&amp;#34;domain:&amp;#34;https://umbrellacorp.atlassian.net&amp;#34;email:&amp;#34;chriscummer@me.com&amp;#34;enabled:truejql:&amp;#34;issueType = Story&amp;#34;position:top:4left:1height:1width:2project:[&amp;#34;ProjectA&amp;#34;,&amp;#34;ProjectB&amp;#34;]refreshInterval:900username:&amp;#34;chris.cummer&amp;#34;verifyServerCertificate:true Attributes colors.rows.even Define the foreground color for even-numbered rows. Values: Any X11 color name.</description>
Keyboard Commands Key: [return] Action: Open the selected issue in the browser.
Key: j Action: Select the next item in the list.
Key: k Action: Select the previous item in the list.
Key: ↓ Action: Select the next item in the list.
Key: ↑ Action: Select the previous item in the list.</description>
</item>
<item>
@ -362,12 +394,11 @@ Key: h Action: Show the previous git repository.</description>
<guid>https://wtfutil.com/posts/modules/weather/</guid>
<description>Displays a configurable list of current weather report, including current temperature, sunrise time, and sunset time.
Source Code wtf/weather/ Required ENV Variables Key: WTF_OWM_API_KEY Action: Your OpenWeatherMap API key.
Source Code wtf/weather/ Required ENV Variables Key: WTF_OWM_API_KEY Action: Your OpenWeatherMap API key. Note: DEPRECATED. See the apiKey config value, below.
Keyboard Commands Key: / Action: Open/close the widget&amp;rsquo;s help window.
Key: h Action: Show the previous weather location.
Key: l Action: Show the next weather location.
Key: ← Action: Show the previous weather location.
Key: → Action: Show the next weather location.</description>
Key: ← Action: Show the previous weather location.</description>
</item>
<item>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -87,7 +87,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -102,6 +102,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>
@ -120,6 +122,20 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<h1 class="title">Posts</h1>
<ul class="posts">
<li>
<span>
<a href="https://wtfutil.com/posts/modules/travisci/">TravisCI</a>
<time class="pull-right post-list">Jul 18, 2018</time>
</span>
</li><li>
<span>
<a href="https://wtfutil.com/posts/modules/todoist/">Todoist</a>
<time class="pull-right post-list">Jul 05, 2018</time>
</span>
</li><li>
<span>
<a href="https://wtfutil.com/posts/modules/gerrit/">Gerrit</a>
@ -170,7 +186,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
</span>
</li><li>
<span>
<a href="https://wtfutil.com/posts/modules/gitlab/">Gitlab</a>
<a href="https://wtfutil.com/posts/modules/gitlab/">GitLab</a>
<time class="pull-right post-list">Jun 08, 2018</time>

View File

@ -6,11 +6,41 @@
<description>Recent content in Posts on WTF - A Terminal Dashboard</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<lastBuildDate>Wed, 27 Jun 2018 15:55:42 -0700</lastBuildDate>
<lastBuildDate>Wed, 18 Jul 2018 14:36:08 -0400</lastBuildDate>
<atom:link href="https://wtfutil.com/posts/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>TravisCI</title>
<link>https://wtfutil.com/posts/modules/travisci/</link>
<pubDate>Wed, 18 Jul 2018 14:36:08 -0400</pubDate>
<guid>https://wtfutil.com/posts/modules/travisci/</guid>
<description>Added in v0.0.12.
Displays build information for your Travis CI account.
Source Code wtf/travisci/ Required ENV Variables Key: WTF_TRAVIS_API_TOKEN Value: Your Travis CI API access token.
Keyboard Commands None.
Configuration travisci:enabled:trueposition:top:4left:1height:1width:2refreshInterval:900 Attributes enabled Determines whether or not this module is executed and if its data displayed onscreen. Values: true, false.
position Defines where in the grid this module&amp;rsquo;s widget will be displayed. refreshInterval How often, in seconds, this module will update its data.</description>
</item>
<item>
<title>Todoist</title>
<link>https://wtfutil.com/posts/modules/todoist/</link>
<pubDate>Thu, 05 Jul 2018 22:55:55 -0300</pubDate>
<guid>https://wtfutil.com/posts/modules/todoist/</guid>
<description>Added in v0.0.11.
Displays all items on specified project.
Source Code wtf/todoist/ Required ENV Variables Key: WTF_TODOIST_TOKEN Value: Your Todoist API Token. You can get your API Token at: todoist.com/prefs/integrations.
Keyboard Commands Key: h Action: Show the previous project.
Key: ← Action: Show the previous project.
Key: l Action: Show the next project.
Key: → Action: Show the next project.
Key: j Action: Select the next item in the list.</description>
</item>
<item>
<title>Gerrit</title>
<link>https://wtfutil.com/posts/modules/gerrit/</link>
@ -112,22 +142,22 @@ position Where in the grid this module&amp;rsquo;s widget will be displayed.</de
Displays jenkins status of given builds in a project or view
Source Code wtf/jenkins/ Required ENV Variables Key: WTF_JENKINS_API_KEY Value: Your Jenkins API key.
Keyboard Commands None.
Configuration jenkins:enabled:trueposition:top:2left:3height:2width:3refreshInterval:300url:&amp;#34;https://jenkins.domain.com/jenkins/view_url&amp;#34;user:&amp;#34;username&amp;#34; Attributes enabled Determines whether or not this module is executed and if its data displayed onscreen. Values: true, false.
Configuration jenkins:enabled:trueposition:top:2left:3height:2width:3refreshInterval:300url:&amp;#34;https://jenkins.domain.com/jenkins/view_url&amp;#34;user:&amp;#34;username&amp;#34;verifyServerCertificate:true Attributes enabled Determines whether or not this module is executed and if its data displayed onscreen. Values: true, false.
position Defines where in the grid this module&amp;rsquo;s widget will be displayed.
refreshInterval How often, in seconds, this module will update its data.</description>
</item>
<item>
<title>Gitlab</title>
<title>GitLab</title>
<link>https://wtfutil.com/posts/modules/gitlab/</link>
<pubDate>Fri, 08 Jun 2018 13:14:11 -0700</pubDate>
<guid>https://wtfutil.com/posts/modules/gitlab/</guid>
<description>Added in v0.0.8.
Displays information about your projects hosted on Gitlab:
Displays information about your projects hosted on GitLab:
Open Approval Requests All open merge requests that are requesting your approval.
Open Merge Requests All open merge requests created by you.
Source Code wtf/gitlab/ Required ENV Variables Key: WTF_GITLAB_TOKEN Action: A Gitlab personal access token. Requires at least api access.
Source Code wtf/gitlab/ Required ENV Variables Key: WTF_GITLAB_TOKEN Action: A GitLab personal access token. Requires at least api access.
Keyboard Commands Key: / Action: Open/close the widget&amp;rsquo;s help window.
Key: h Action: Show the previous project.</description>
</item>
@ -294,9 +324,11 @@ Key: j Action: Select the next item in the list.</description>
<guid>https://wtfutil.com/posts/modules/jira/</guid>
<description>Displays all Jira issues assigned to you for the specified project.
Source Code wtf/jira/ Required ENV Variables Key: WTF_JIRA_API_KEY Value: Your Jira API key.
Keyboard Commands None.
Configuration Single Jira Project jira:colors:rows:even:&amp;#34;lightblue&amp;#34;odd:&amp;#34;white&amp;#34;domain:&amp;#34;https://umbrellacorp.atlassian.net&amp;#34;email:&amp;#34;chriscummer@me.com&amp;#34;enabled:truejql:&amp;#34;issueType = Story&amp;#34;position:top:4left:1height:1width:2project:&amp;#34;ProjectA&amp;#34;refreshInterval:900username:&amp;#34;chris.cummer&amp;#34;verifyServerCertificate:true Multiple Jira Projects If you want to monitor multiple Jira projects, use the following configuration (note the difference in project):
jira:colors:rows:even:&amp;#34;lightblue&amp;#34;odd:&amp;#34;white&amp;#34;domain:&amp;#34;https://umbrellacorp.atlassian.net&amp;#34;email:&amp;#34;chriscummer@me.com&amp;#34;enabled:truejql:&amp;#34;issueType = Story&amp;#34;position:top:4left:1height:1width:2project:[&amp;#34;ProjectA&amp;#34;,&amp;#34;ProjectB&amp;#34;]refreshInterval:900username:&amp;#34;chris.cummer&amp;#34;verifyServerCertificate:true Attributes colors.rows.even Define the foreground color for even-numbered rows. Values: Any X11 color name.</description>
Keyboard Commands Key: [return] Action: Open the selected issue in the browser.
Key: j Action: Select the next item in the list.
Key: k Action: Select the previous item in the list.
Key: ↓ Action: Select the next item in the list.
Key: ↑ Action: Select the previous item in the list.</description>
</item>
<item>
@ -362,12 +394,11 @@ Key: h Action: Show the previous git repository.</description>
<guid>https://wtfutil.com/posts/modules/weather/</guid>
<description>Displays a configurable list of current weather report, including current temperature, sunrise time, and sunset time.
Source Code wtf/weather/ Required ENV Variables Key: WTF_OWM_API_KEY Action: Your OpenWeatherMap API key.
Source Code wtf/weather/ Required ENV Variables Key: WTF_OWM_API_KEY Action: Your OpenWeatherMap API key. Note: DEPRECATED. See the apiKey config value, below.
Keyboard Commands Key: / Action: Open/close the widget&amp;rsquo;s help window.
Key: h Action: Show the previous weather location.
Key: l Action: Show the next weather location.
Key: ← Action: Show the previous weather location.
Key: → Action: Show the next weather location.</description>
Key: ← Action: Show the previous weather location.</description>
</item>
<item>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>
@ -179,10 +181,12 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
</span><span class="w"> </span>height<span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w">
</span><span class="w"> </span>width<span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w">
</span><span class="w"> </span>refreshInterval<span class="p">:</span><span class="w"> </span><span class="m">300</span><span class="w">
</span><span class="w"> </span>domain<span class="p">:</span><span class="w"> </span>https<span class="p">:</span>//gerrit-review.googlesource.com<span class="w">
</span><span class="w"> </span>projects<span class="p">:</span><span class="w">
</span><span class="w"> </span>-<span class="w"> </span>org/test-project<span class="s2">&#34;
</span><span class="s2"> - dotfiles
</span><span class="s2"> username: &#34;</span>myname&#34;</code></pre></div>
</span><span class="s2"> username: &#34;</span>myname&#34;<span class="w">
</span><span class="w"> </span>verifyServerCertificate<span class="p">:</span><span class="w"> </span><span class="kc">false</span></code></pre></div>
<h3 id="attributes">Attributes</h3>
<p><code>enabled</code> <br />
@ -197,7 +201,7 @@ How often, in seconds, this module will update its data. <br />
Values: A positive integer, <code>0..n</code>.</p>
<p><code>domain</code> <br />
<em>Optional</em>. Your Gerrit corporate domain. <br />
Your Gerrit corporate domain. <br />
Values: A valid URI.</p>
<p><code>projects</code> <br />

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>
@ -184,6 +186,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<h2 id="configuration">Configuration</h2>
<div class="highlight"><pre class="chroma"><code class="language-yaml" data-lang="yaml">github<span class="p">:</span><span class="w">
</span><span class="w"> </span>enabled<span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span><span class="w"> </span>enableStatus<span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span><span class="w"> </span>position<span class="p">:</span><span class="w">
</span><span class="w"> </span>top<span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w">
</span><span class="w"> </span>left<span class="p">:</span><span class="w"> </span><span class="m">3</span><span class="w">
@ -200,6 +203,11 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
Determines whether or not this module is executed and if its data displayed onscreen. <br />
Values: <code>true</code>, <code>false</code>.</p>
<p><code>enableStatus</code> <br />
Display pull request mergeability status (&lsquo;dirty&rsquo;, &lsquo;clean&rsquo;, &lsquo;unstable&rsquo;,
&lsquo;blocked&rsquo;).<br />
Values: <code>true</code>, <code>false</code>.</p>
<p><code>position</code> <br />
Defines where in the grid this module&rsquo;s widget will be displayed. <br /></p>

View File

@ -10,8 +10,8 @@
<meta name="generator" content="Hugo 0.38.2" />
<title>Gitlab | WTF - A Terminal Dashboard</title>
<meta content="Gitlab - WTF - A Terminal Dashboard" property="og:title">
<title>GitLab | WTF - A Terminal Dashboard</title>
<meta content="GitLab - WTF - A Terminal Dashboard" property="og:title">
<meta content=" - " property="og:description">
<!-- CSS -->
<link rel="stylesheet" href="//cdn.rawgit.com/milligram/milligram/master/dist/milligram.min.css">
@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>
@ -116,7 +118,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<div class="content container">
<div class="post">
<h1>Gitlab</h1>
<h1>GitLab</h1>
<div class="col-sm-12 col-md-12">
<span class="text-left post-date meta">
@ -138,7 +140,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<p><img src="/imgs/modules/gitlab.png" width="640" height="384" alt="gitlab screenshot" /></p>
<p>Displays information about your projects hosted on Gitlab:</p>
<p>Displays information about your projects hosted on GitLab:</p>
<h4 id="open-approval-requests">Open Approval Requests</h4>
@ -153,7 +155,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<h2 id="required-env-variables">Required ENV Variables</h2>
<p><span class="caption">Key:</span> <code>WTF_GITLAB_TOKEN</code> <br />
<span class="caption">Action:</span> A <a href="https://docs.gitlab.com/ce/user/profile/personal_access_tokens.html">Gitlab personal access token</a>. Requires at least <code>api</code> access.</p>
<span class="caption">Action:</span> A <a href="https://docs.gitlab.com/ce/user/profile/personal_access_tokens.html">GitLab personal access token</a>. Requires at least <code>api</code> access.</p>
<h2 id="keyboard-commands">Keyboard Commands</h2>
@ -199,17 +201,17 @@ How often, in seconds, this module will update its data. <br />
Values: A positive integer, <code>0..n</code>.</p>
<p><code>domain</code> <br />
<em>Optional</em>. Your Gitlab corporate domain. <br />
<em>Optional</em>. Your GitLab corporate domain. <br />
Values: A valid URI.</p>
<p><code>projects</code> <br />
A list of key/value pairs each describing a Gitlab project to fetch data
A list of key/value pairs each describing a GitLab project to fetch data
for. <br />
<span class="caption">Key:</span> The name of the project. <br />
<span class="caption">Value:</span> The namespace of the project.</p>
<p><code>username</code> <br />
Your Gitlab username. Used to figure out which requests require your approval</p>
Your GitLab username. Used to figure out which requests require your approval</p>
</div>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>
@ -162,7 +164,8 @@ width="320" height="68" alt="jenkins screenshot" /></p>
</span><span class="w"> </span>width<span class="p">:</span><span class="w"> </span><span class="m">3</span><span class="w">
</span><span class="w"> </span>refreshInterval<span class="p">:</span><span class="w"> </span><span class="m">300</span><span class="w">
</span><span class="w"> </span>url<span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://jenkins.domain.com/jenkins/view_url&#34;</span><span class="w">
</span><span class="w"> </span>user<span class="p">:</span><span class="w"> </span><span class="s2">&#34;username&#34;</span></code></pre></div>
</span><span class="w"> </span>user<span class="p">:</span><span class="w"> </span><span class="s2">&#34;username&#34;</span><span class="w">
</span><span class="w"> </span>verifyServerCertificate<span class="p">:</span><span class="w"> </span><span class="kc">true</span></code></pre></div>
<h3 id="attributes">Attributes</h3>
<p><code>enabled</code> <br />
@ -183,6 +186,11 @@ Your Jenkins username. <br /></p>
The url to your Jenkins project or view. <br />
Values: A valid URI.</p>
<p><code>verifyServerCertificate</code> <br />
<em>Optional</em> <br />
Determines whether or not the server&rsquo;s certificate chain and host name are verified. <br />
Values: <code>true</code>, <code>false</code>.</p>
</div>
<div class="footer">

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>
@ -147,7 +149,20 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<h2 id="keyboard-commands">Keyboard Commands</h2>
<p>None.</p>
<p><span class="caption">Key:</span> <code>[return]</code> <br />
<span class="caption">Action:</span> Open the selected issue in the browser.</p>
<p><span class="caption">Key:</span> <code>j</code> <br />
<span class="caption">Action:</span> Select the next item in the list.</p>
<p><span class="caption">Key:</span> <code>k</code> <br />
<span class="caption">Action:</span> Select the previous item in the list.</p>
<p><span class="caption">Key:</span> <code></code> <br />
<span class="caption">Action:</span> Select the next item in the list.</p>
<p><span class="caption">Key:</span> <code></code> <br />
<span class="caption">Action:</span> Select the previous item in the list.</p>
<h2 id="configuration">Configuration</h2>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -0,0 +1,228 @@
<!DOCTYPE html>
<html lang="en-us" class="wf-firasans-n4-active wf-active">
<head>
<link href="http://gmpg.org/xfn/11" rel="profile">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- Enable responsiveness on mobile devices -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<meta name="generator" content="Hugo 0.38.2" />
<title>Todoist | WTF - A Terminal Dashboard</title>
<meta content="Todoist - WTF - A Terminal Dashboard" property="og:title">
<meta content=" - " property="og:description">
<!-- CSS -->
<link rel="stylesheet" href="//cdn.rawgit.com/milligram/milligram/master/dist/milligram.min.css">
<link href="https://fonts.googleapis.com/css?family=Fira+Sans:300,300i,400,400i|Roboto+Mono:300,300i,400,400i" rel="stylesheet">
<link rel="stylesheet" href="https://wtfutil.com/css/print.css" media="print">
<link rel="stylesheet" href="https://wtfutil.com/css/poole.css">
<link rel="stylesheet" href="https://wtfutil.com/css/hyde.css">
<link rel="stylesheet" href="https://wtfutil.com/css/syntax.css">
<link rel="stylesheet" href="https://wtfutil.com/css/wtf.css">
<!-- Font-Awesome -->
<script defer src="https://use.fontawesome.com/releases/v5.0.9/js/all.js" integrity="sha384-8iPTk2s/jMVj81dnzb/iFR2sdA7u06vHJyyLlAd4snFpCl/SnyUjRrbdJsw1pGIl" crossorigin="anonymous"></script>
<!-- Customised CSS -->
<link rel="stylesheet" href="https://wtfutil.com/css/custom.css">
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<!-- Icons -->
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="/apple-touch-icon-144-precomposed.png">
<link rel="shortcut icon" href="/favicon.png">
<script async defer src="https://buttons.github.io/buttons.js"></script>
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-532RMQJ');</script>
</head>
<body>
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-532RMQJ"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<div class="sidebar">
<div class="container">
<div class="sidebar-about text-center">
<a href="https://wtfutil.com/"> <img src="/img/wtf.png" alt="WFT Logo" class="" width=""> </a>
<p class="lead">
</p>
</div>
<div>
<h3 style="color: white;">Content</h3>
<ul style="list-style-type: none;">
<li class="sidebar-list-item-1"><a href="/posts/overview/">Overview</a></li>
<li class="sidebar-list-item-1"><a href="/posts/installation/">Installation</a></li>
<li class="sidebar-list-item-1"><a href="/posts/configuration/">Configuration</a></li>
<li class="sidebar-list-item-2"><a href="/posts/configuration/attributes/">Attributes</a></li>
<li class="sidebar-list-item-2"><a href="/posts/configuration/iterm2/">iTerm2</a></li>
<li class="sidebar-list-item-1"><a href="https://github.com/senorprogrammer/wtf/releases">Releases</a></li>
</ul>
<ul style="list-style-type: none;">
<li class="sidebar-list-item-1"><a href="/posts/modules/">Modules</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/bamboohr/">BambooHR</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/cryptocurrencies/bittrex/">Bittrex</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/cryptocurrencies/blockfolio/">Blockfolio</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/circleci/">CircleCI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/clocks/">Clocks</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/cryptocurrencies/cryptolive/">CryptoLive</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/cmdrunner/">CmdRunner</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipinfo/">IPInfo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/jenkins/">Jenkins</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/jira/">Jira</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/logger/">Logger</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/newrelic/">New Relic</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/opsgenie/">OpsGenie</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/power/">Power</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/prettyweather/">PrettyWeather</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>
</div>
<p class="copyright">
&copy; 2018 Chris Cummer.
<br />
<a href="https://creativecommons.org/licenses/by/4.0">Some Rights Reserved</a>.
</p>
</div>
</div>
<div class="content container">
<div class="post">
<h1>Todoist</h1>
<div class="col-sm-12 col-md-12">
<span class="text-left post-date meta">
Jul 05, 2018
<br/>
</span>
</div>
<p>Added in <code>v0.0.11</code>.</p>
<p>Displays all items on specified project.</p>
<p><img src="/imgs/modules/todoist.png" alt="todoist screenshot" /></p>
<h2 id="source-code">Source Code</h2>
<div class="highlight"><pre class="chroma"><code class="language-bash" data-lang="bash">wtf/todoist/</code></pre></div>
<h2 id="required-env-variables">Required ENV Variables</h2>
<p><span class="caption">Key:</span> <code>WTF_TODOIST_TOKEN</code> <br />
<span class="caption">Value:</span> Your Todoist API Token. <br /></p>
<p><em>You can get your API Token at: todoist.com/prefs/integrations.</em></p>
<h2 id="keyboard-commands">Keyboard Commands</h2>
<p><span class="caption">Key:</span> <code>h</code> <br />
<span class="caption">Action:</span> Show the previous project.</p>
<p><span class="caption">Key:</span> <code></code> <br />
<span class="caption">Action:</span> Show the previous project.</p>
<p><span class="caption">Key:</span> <code>l</code> <br />
<span class="caption">Action:</span> Show the next project.</p>
<p><span class="caption">Key:</span> <code></code> <br />
<span class="caption">Action:</span> Show the next project.</p>
<p><span class="caption">Key:</span> <code>j</code> <br />
<span class="caption">Action:</span> Select the next item in the list.</p>
<p><span class="caption">Key:</span> <code></code> <br />
<span class="caption">Action:</span> Select the next item in the list.</p>
<p><span class="caption">Key:</span> <code>k</code> <br />
<span class="caption">Action:</span> Select the previous item in the list.</p>
<p><span class="caption">Key:</span> <code></code> <br />
<span class="caption">Action:</span> Select the previous item in the list.</p>
<p><span class="caption">Key:</span> <code>c</code> <br />
<span class="caption">Action:</span> Close current item.</p>
<p><span class="caption">Key:</span> <code>d</code> <br />
<span class="caption">Action:</span> Delete current item.</p>
<p><span class="caption">Key:</span> <code>r</code> <br />
<span class="caption">Action:</span> Reload all projects.</p>
<h2 id="configuration">Configuration</h2>
<div class="highlight"><pre class="chroma"><code class="language-yaml" data-lang="yaml">todoist<span class="p">:</span><span class="w">
</span><span class="w"> </span>enabled<span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span><span class="w"> </span>position<span class="p">:</span><span class="w">
</span><span class="w"> </span>top<span class="p">:</span><span class="w"> </span><span class="m">0</span><span class="w">
</span><span class="w"> </span>left<span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w">
</span><span class="w"> </span>height<span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w">
</span><span class="w"> </span>width<span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w">
</span><span class="w"> </span>projects<span class="p">:</span><span class="w">
</span><span class="w"> </span>-<span class="w"> </span><span class="m">122247497</span><span class="w">
</span><span class="w"> </span>refreshInterval<span class="p">:</span><span class="w"> </span><span class="m">3600</span></code></pre></div>
<h3 id="attributes">Attributes</h3>
<p><code>enabled</code> <br />
Determines whether or not this module is executed and if its data displayed onscreen. <br />
Values: <code>true</code>, <code>false</code>.</p>
<p><code>position</code> <br />
Where in the grid this module&rsquo;s widget will be displayed. <br /></p>
<p><code>projects</code> <br />
The todoist projects to fetch items from. <br />
Values: The integer ID of the project.</p>
<p><code>refreshInterval</code> <br />
How often, in seconds, this module will update its data. <br />
Values: A positive integer, <code>0..n</code>.</p>
</div>
<div class="footer">
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,189 @@
<!DOCTYPE html>
<html lang="en-us" class="wf-firasans-n4-active wf-active">
<head>
<link href="http://gmpg.org/xfn/11" rel="profile">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- Enable responsiveness on mobile devices -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<meta name="generator" content="Hugo 0.38.2" />
<title>TravisCI | WTF - A Terminal Dashboard</title>
<meta content="TravisCI - WTF - A Terminal Dashboard" property="og:title">
<meta content=" - " property="og:description">
<!-- CSS -->
<link rel="stylesheet" href="//cdn.rawgit.com/milligram/milligram/master/dist/milligram.min.css">
<link href="https://fonts.googleapis.com/css?family=Fira+Sans:300,300i,400,400i|Roboto+Mono:300,300i,400,400i" rel="stylesheet">
<link rel="stylesheet" href="https://wtfutil.com/css/print.css" media="print">
<link rel="stylesheet" href="https://wtfutil.com/css/poole.css">
<link rel="stylesheet" href="https://wtfutil.com/css/hyde.css">
<link rel="stylesheet" href="https://wtfutil.com/css/syntax.css">
<link rel="stylesheet" href="https://wtfutil.com/css/wtf.css">
<!-- Font-Awesome -->
<script defer src="https://use.fontawesome.com/releases/v5.0.9/js/all.js" integrity="sha384-8iPTk2s/jMVj81dnzb/iFR2sdA7u06vHJyyLlAd4snFpCl/SnyUjRrbdJsw1pGIl" crossorigin="anonymous"></script>
<!-- Customised CSS -->
<link rel="stylesheet" href="https://wtfutil.com/css/custom.css">
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<!-- Icons -->
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="/apple-touch-icon-144-precomposed.png">
<link rel="shortcut icon" href="/favicon.png">
<script async defer src="https://buttons.github.io/buttons.js"></script>
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-532RMQJ');</script>
</head>
<body>
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-532RMQJ"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<div class="sidebar">
<div class="container">
<div class="sidebar-about text-center">
<a href="https://wtfutil.com/"> <img src="/img/wtf.png" alt="WFT Logo" class="" width=""> </a>
<p class="lead">
</p>
</div>
<div>
<h3 style="color: white;">Content</h3>
<ul style="list-style-type: none;">
<li class="sidebar-list-item-1"><a href="/posts/overview/">Overview</a></li>
<li class="sidebar-list-item-1"><a href="/posts/installation/">Installation</a></li>
<li class="sidebar-list-item-1"><a href="/posts/configuration/">Configuration</a></li>
<li class="sidebar-list-item-2"><a href="/posts/configuration/attributes/">Attributes</a></li>
<li class="sidebar-list-item-2"><a href="/posts/configuration/iterm2/">iTerm2</a></li>
<li class="sidebar-list-item-1"><a href="https://github.com/senorprogrammer/wtf/releases">Releases</a></li>
</ul>
<ul style="list-style-type: none;">
<li class="sidebar-list-item-1"><a href="/posts/modules/">Modules</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/bamboohr/">BambooHR</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/cryptocurrencies/bittrex/">Bittrex</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/cryptocurrencies/blockfolio/">Blockfolio</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/circleci/">CircleCI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/clocks/">Clocks</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/cryptocurrencies/cryptolive/">CryptoLive</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/cmdrunner/">CmdRunner</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipinfo/">IPInfo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/jenkins/">Jenkins</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/jira/">Jira</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/logger/">Logger</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/newrelic/">New Relic</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/opsgenie/">OpsGenie</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/power/">Power</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/prettyweather/">PrettyWeather</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>
</div>
<p class="copyright">
&copy; 2018 Chris Cummer.
<br />
<a href="https://creativecommons.org/licenses/by/4.0">Some Rights Reserved</a>.
</p>
</div>
</div>
<div class="content container">
<div class="post">
<h1>TravisCI</h1>
<div class="col-sm-12 col-md-12">
<span class="text-left post-date meta">
Jul 18, 2018
<br/>
</span>
</div>
<p>Added in <code>v0.0.12</code>.</p>
<p>Displays build information for your Travis CI account.</p>
<p><img src="/imgs/modules/travisci.png" width="609" height="150" alt="travisci screenshot" /></p>
<h2 id="source-code">Source Code</h2>
<div class="highlight"><pre class="chroma"><code class="language-bash" data-lang="bash">wtf/travisci/</code></pre></div>
<h2 id="required-env-variables">Required ENV Variables</h2>
<p><span class="caption">Key:</span> <code>WTF_TRAVIS_API_TOKEN</code> <br />
<span class="caption">Value:</span> Your <a href="https://developer.travis-ci.org/authentication">Travis CI API</a> access token.</p>
<h2 id="keyboard-commands">Keyboard Commands</h2>
<p>None.</p>
<h2 id="configuration">Configuration</h2>
<div class="highlight"><pre class="chroma"><code class="language-yaml" data-lang="yaml">travisci<span class="p">:</span><span class="w">
</span><span class="w"> </span>enabled<span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span><span class="w"> </span>position<span class="p">:</span><span class="w">
</span><span class="w"> </span>top<span class="p">:</span><span class="w"> </span><span class="m">4</span><span class="w">
</span><span class="w"> </span>left<span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w">
</span><span class="w"> </span>height<span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w">
</span><span class="w"> </span>width<span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w">
</span><span class="w"> </span>refreshInterval<span class="p">:</span><span class="w"> </span><span class="m">900</span></code></pre></div>
<h3 id="attributes">Attributes</h3>
<p><code>enabled</code> <br />
Determines whether or not this module is executed and if its data displayed onscreen. <br />
Values: <code>true</code>, <code>false</code>.</p>
<p><code>position</code> <br />
Defines where in the grid this module&rsquo;s widget will be displayed. <br /></p>
<p><code>refreshInterval</code> <br />
How often, in seconds, this module will update its data. <br />
Values: A positive integer, <code>0..n</code>.</p>
</div>
<div class="footer">
</div>
</div>
</body>
</html>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>
@ -144,7 +146,8 @@ current temperature, sunrise time, and sunset time.</p>
<h2 id="required-env-variables">Required ENV Variables</h2>
<p><span class="caption">Key:</span> <code>WTF_OWM_API_KEY</code> <br />
<span class="caption">Action:</span> Your <a href="https://openweathermap.org/appid">OpenWeatherMap API</a> key.</p>
<span class="caption">Action:</span> Your <a href="https://openweathermap.org/appid">OpenWeatherMap API</a> key. <br />
<span class="caption">Note:</span> DEPRECATED. See the <code>apiKey</code> config value, below.</p>
<h2 id="keyboard-commands">Keyboard Commands</h2>
@ -165,6 +168,7 @@ current temperature, sunrise time, and sunset time.</p>
<h2 id="configuration">Configuration</h2>
<div class="highlight"><pre class="chroma"><code class="language-yaml" data-lang="yaml">weather<span class="p">:</span><span class="w">
</span><span class="w"> </span>apiKey<span class="p">:</span><span class="w"> </span><span class="s2">&#34;2dfb3e3650a1950adddb6badf5ba1aaa&#34;</span><span class="w">
</span><span class="w"> </span><span class="c"># From http://openweathermap.org/help/city_list.txt</span><span class="w">
</span><span class="w"> </span>cityids<span class="p">:</span><span class="w">
</span><span class="w"> </span>-<span class="w"> </span><span class="m">6173331</span><span class="w">
@ -184,6 +188,9 @@ current temperature, sunrise time, and sunset time.</p>
</span><span class="w"> </span>tempUnit<span class="p">:</span><span class="w"> </span><span class="s2">&#34;C&#34;</span></code></pre></div>
<h3 id="attributes">Attributes</h3>
<p><code>apiKey</code> <br />
Your <a href="https://openweathermap.org/appid">OpenWeatherMap API</a> key.</p>
<p><code>cityids</code> <br />
A list of the <a
href="http://openweathermap.org/help/city_list.txt">OpenWeatherMap city

View File

@ -85,7 +85,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -100,6 +100,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -2,6 +2,16 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://wtfutil.com/posts/modules/travisci/</loc>
<lastmod>2018-07-18T14:36:08-04:00</lastmod>
</url>
<url>
<loc>https://wtfutil.com/posts/modules/todoist/</loc>
<lastmod>2018-07-05T22:55:55-03:00</lastmod>
</url>
<url>
<loc>https://wtfutil.com/posts/modules/gerrit/</loc>
<lastmod>2018-06-27T15:55:42-07:00</lastmod>
@ -179,7 +189,7 @@
<url>
<loc>https://wtfutil.com/posts/</loc>
<lastmod>2018-06-27T15:55:42-07:00</lastmod>
<lastmod>2018-07-18T14:36:08-04:00</lastmod>
<priority>0</priority>
</url>
@ -190,7 +200,7 @@
<url>
<loc>https://wtfutil.com/</loc>
<lastmod>2018-06-27T15:55:42-07:00</lastmod>
<lastmod>2018-07-18T14:36:08-04:00</lastmod>
<priority>0</priority>
</url>

View File

@ -87,7 +87,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/gerrit/">Gerrit</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/git/">Git</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/github/">GitHub</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">Gitlab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gitlab/">GitLab</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gcal/">Google Calendar</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/gspreadsheet">Google Spreadsheet</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/ipapi/">IP-API</a></li>
@ -102,6 +102,8 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<li class="sidebar-list-item-2"><a href="/posts/modules/security/">Security</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/textfile/">Text File</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todo/">Todo</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/todoist/">Todoist</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/travisci/">Travis CI</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/trello/">Trello</a></li>
<li class="sidebar-list-item-2"><a href="/posts/modules/weather/">Weather</a></li>
</ul>

View File

@ -13,6 +13,7 @@ import (
type Flags struct {
Config string `short:"c" long:"config" optional:"yes" description:"Path to config file"`
Module string `short:"m" long:"module" optional:"yes" description:"Display info about a specific module, i.e.: 'wtf -m=todo'"`
Profile bool `short:"p" long:"profile" optional:"yes" description:"Profile application memory usage"`
Version bool `short:"v" long:"version" description:"Show version info"`
}

View File

@ -3,6 +3,7 @@ package github
import (
"fmt"
"github.com/google/go-github/github"
"github.com/senorprogrammer/wtf/wtf"
)
@ -37,7 +38,7 @@ func (widget *Widget) displayMyPullRequests(repo *GithubRepo, username string) s
str := ""
for _, pr := range prs {
str = str + fmt.Sprintf(" [green]%4d[white] %s\n", *pr.Number, *pr.Title)
str = str + fmt.Sprintf(" %s[green]%4d[white] %s\n", mergeString(pr), *pr.Number, *pr.Title)
}
return str
@ -72,3 +73,24 @@ func (widget *Widget) displayStats(repo *GithubRepo) string {
func (widget *Widget) title(repo *GithubRepo) string {
return fmt.Sprintf("[green]%s - %s[white]", repo.Owner, repo.Name)
}
func showStatus() bool {
return wtf.Config.UBool("wtf.mods.github.enableStatus", false)
}
var mergeIcons = map[string]string{
"dirty": "[red]![white] ",
"clean": "[green]✔[white] ",
"unstable": "[red]✖[white] ",
"blocked": "[red]✖[white] ",
}
func mergeString(pr *github.PullRequest) string {
if !showStatus() {
return ""
}
if str, ok := mergeIcons[pr.GetMergeableState()]; ok {
return str
}
return "? "
}

View File

@ -103,9 +103,35 @@ func (repo *GithubRepo) myPullRequests(username string) []*ghb.PullRequest {
}
}
if showStatus() {
prs = repo.individualPRs(prs)
}
return prs
}
// individualPRs takes a list of pull requests (presumably returned from
// github.PullRequests.List) and fetches them individually to get more detailed
// status info on each. see: https://developer.github.com/v3/git/#checking-mergeability-of-pull-requests
func (repo *GithubRepo) individualPRs(prs []*ghb.PullRequest) []*ghb.PullRequest {
github, err := repo.githubClient()
if err != nil {
return prs
}
var ret []*ghb.PullRequest
for i := range prs {
pr, _, err := github.PullRequests.Get(context.Background(), repo.Owner, repo.Name, prs[i].GetNumber())
if err != nil {
// worst case, just keep the original one
ret = append(ret, prs[i])
} else {
ret = append(ret, pr)
}
}
return ret
}
// myReviewRequests returns a list of pull requests for which username has been
// requested to do a code review
func (repo *GithubRepo) myReviewRequests(username string) []*ghb.PullRequest {

View File

@ -2,12 +2,15 @@ package jenkins
import (
"bytes"
"crypto/tls"
"encoding/json"
"io"
"io/ioutil"
"net/http"
"net/url"
"strings"
"github.com/senorprogrammer/wtf/wtf"
)
func Create(jenkinsURL string, username string, apiKey string) (*View, error) {
@ -26,7 +29,13 @@ func Create(jenkinsURL string, username string, apiKey string) (*View, error) {
req, _ := http.NewRequest("GET", jenkinsAPIURL.String(), nil)
req.SetBasicAuth(username, apiKey)
httpClient := &http.Client{}
verifyServerCertificate := wtf.Config.UBool("wtf.mods.jenkins.verifyServerCertificate", true)
httpClient := &http.Client{Transport: &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: !verifyServerCertificate,
},
},
}
resp, err := httpClient.Do(req)
if err != nil {

View File

@ -3,18 +3,24 @@ package jira
import (
"fmt"
"github.com/gdamore/tcell"
"github.com/senorprogrammer/wtf/wtf"
)
type Widget struct {
wtf.TextWidget
result *SearchResult
selected int
}
func NewWidget() *Widget {
widget := Widget{
TextWidget: wtf.NewTextWidget(" Jira ", "jira", false),
TextWidget: wtf.NewTextWidget(" Jira ", "jira", true),
}
widget.unselect()
widget.View.SetInputCapture(widget.keyboardIntercept)
return &widget
}
@ -29,12 +35,24 @@ func (widget *Widget) Refresh() {
widget.UpdateRefreshedAt()
var content string
if err != nil {
widget.result = nil
widget.View.SetWrap(true)
widget.View.SetTitle(widget.Name)
content = err.Error()
widget.View.SetText(err.Error())
} else {
widget.result = searchResult
}
widget.display()
}
/* -------------------- Unexported Functions -------------------- */
func (widget *Widget) display() {
if widget.result == nil {
return
}
widget.View.SetWrap(false)
widget.View.SetTitle(
fmt.Sprintf(
@ -43,31 +61,68 @@ func (widget *Widget) Refresh() {
wtf.Config.UString("wtf.mods.jira.project"),
),
)
content = widget.contentFrom(searchResult)
widget.View.SetText(fmt.Sprintf("%s", widget.contentFrom(widget.result)))
}
widget.View.SetText(content)
func (widget *Widget) next() {
widget.selected++
if widget.result != nil && widget.selected >= len(widget.result.Issues) {
widget.selected = 0
}
}
/* -------------------- Unexported Functions -------------------- */
func (widget *Widget) prev() {
widget.selected--
if widget.selected < 0 && widget.result != nil {
widget.selected = len(widget.result.Issues) - 1
}
}
func (widget *Widget) openItem() {
sel := widget.selected
if sel >= 0 && widget.result != nil && sel < len(widget.result.Issues) {
issue := &widget.result.Issues[widget.selected]
wtf.OpenFile(wtf.Config.UString("wtf.mods.jira.domain") + "/browse/" + issue.Key)
}
}
func (widget *Widget) unselect() {
widget.selected = -1
}
func (widget *Widget) contentFrom(searchResult *SearchResult) string {
str := " [red]Assigned Issues[white]\n"
for idx, issue := range searchResult.Issues {
str = str + fmt.Sprintf(
" [%s]%-6s[white] [green]%-10s[%s] %s\n",
fmtStr := fmt.Sprintf(
"[%s] [%s]%-6s[white] [green]%-10s[white] [%s]%s",
widget.rowColor(idx),
widget.issueTypeColor(&issue),
issue.IssueFields.IssueType.Name,
issue.Key,
wtf.RowColor("jira", idx),
widget.rowColor(idx),
issue.IssueFields.Summary,
)
_, _, w, _ := widget.View.GetInnerRect()
fmtStr = fmtStr + wtf.PadRow(len(issue.IssueFields.Summary), w+1)
str = str + fmtStr + "\n"
}
return str
}
func (widget *Widget) rowColor(idx int) string {
if widget.View.HasFocus() && (idx == widget.selected) {
foreColor := wtf.Config.UString("wtf.colors.highlight.fore", "black")
backColor := wtf.Config.UString("wtf.colors.highlight.back", "orange")
return fmt.Sprintf("%s:%s", foreColor, backColor)
}
return wtf.RowColor("jira", idx)
}
func (widget *Widget) issueTypeColor(issue *Issue) string {
switch issue.IssueFields.IssueType.Name {
case "Bug":
@ -98,3 +153,42 @@ func getProjects() []string {
}
return ret
}
func (widget *Widget) keyboardIntercept(event *tcell.EventKey) *tcell.EventKey {
switch string(event.Rune()) {
case "j":
// Select the next item down
widget.next()
widget.display()
return nil
case "k":
// Select the next item up
widget.prev()
widget.display()
return nil
}
switch event.Key() {
case tcell.KeyDown:
// Select the next item down
widget.next()
widget.display()
return nil
case tcell.KeyEnter:
widget.openItem()
return nil
case tcell.KeyEsc:
// Unselect the current row
widget.unselect()
widget.display()
return event
case tcell.KeyUp:
// Select the next item up
widget.prev()
widget.display()
return nil
default:
// Pass it along
return event
}
}

View File

@ -3,6 +3,8 @@ package todo
import (
"fmt"
"github.com/rivo/tview"
"github.com/senorprogrammer/wtf/checklist"
"github.com/senorprogrammer/wtf/wtf"
)
@ -10,38 +12,35 @@ const checkWidth = 4
func (widget *Widget) display() {
str := ""
newList := List{selected: -1}
selectedItem := widget.list.Selected()
maxLineLen := widget.list.LongestLine()
newList := checklist.NewChecklist()
for _, item := range widget.list.UncheckedItems() {
str = str + widget.formattedItemLine(item, selectedItem, maxLineLen)
str = str + widget.formattedItemLine(item, widget.list.SelectedItem(), widget.list.LongestLine())
newList.Items = append(newList.Items, item)
}
for _, item := range widget.list.CheckedItems() {
str = str + widget.formattedItemLine(item, selectedItem, maxLineLen)
str = str + widget.formattedItemLine(item, widget.list.SelectedItem(), widget.list.LongestLine())
newList.Items = append(newList.Items, item)
}
newList.SetSelectedByItem(widget.list.Selected())
widget.SetList(&newList)
newList.SetSelectedByItem(widget.list.SelectedItem())
widget.SetList(newList)
widget.View.Clear()
widget.View.SetText(str)
}
func (widget *Widget) formattedItemLine(item *Item, selectedItem *Item, maxLen int) string {
func (widget *Widget) formattedItemLine(item *checklist.ChecklistItem, selectedItem *checklist.ChecklistItem, maxLen int) string {
foreColor, backColor := "white", wtf.Config.UString("wtf.colors.background", "black")
if item.Checked {
foreColor = wtf.Config.UString("wtf.mods.todo.colors.checked", "white")
foreColor = wtf.Config.UString("wtf.colors.checked", "white")
}
if widget.View.HasFocus() && (item == selectedItem) {
foreColor = wtf.Config.UString("wtf.mods.todo.colors.highlight.fore", "black")
backColor = wtf.Config.UString("wtf.mods.todo.colors.highlight.back", "white")
foreColor = wtf.Config.UString("wtf.colors.highlight.fore", "black")
backColor = wtf.Config.UString("wtf.colors.highlight.back", "orange")
}
str := fmt.Sprintf(
@ -49,10 +48,13 @@ func (widget *Widget) formattedItemLine(item *Item, selectedItem *Item, maxLen i
foreColor,
backColor,
item.CheckMark(),
item.Text,
tview.Escape(item.Text),
)
str = str + wtf.PadRow((checkWidth+len(item.Text)), (checkWidth+maxLen)) + "\n"
return str
_, _, w, _ := widget.View.GetInnerRect()
if w > maxLen {
maxLen = w
}
return str + wtf.PadRow((checkWidth+len(item.Text)), (checkWidth+maxLen+1)) + "\n"
}

View File

@ -1,22 +0,0 @@
package todo
import (
"github.com/senorprogrammer/wtf/wtf"
)
type Item struct {
Checked bool
Text string
}
func (item *Item) CheckMark() string {
if item.Checked {
return wtf.Config.UString("wtf.mods.todo.checkedIcon", "x")
} else {
return " "
}
}
func (item *Item) Toggle() {
item.Checked = !item.Checked
}

View File

@ -1,165 +0,0 @@
package todo
type List struct {
Items []*Item
selected int
}
/* -------------------- Exported Functions -------------------- */
func (list *List) Add(text string) {
item := Item{
Checked: false,
Text: text,
}
list.Items = append([]*Item{&item}, list.Items...)
}
func (list *List) CheckedItems() []*Item {
items := []*Item{}
for _, item := range list.Items {
if item.Checked {
items = append(items, item)
}
}
return items
}
func (list *List) Delete() {
list.Items = append(list.Items[:list.selected], list.Items[list.selected+1:]...)
list.Prev()
}
func (list *List) Demote() {
if list.isUnselectable() {
return
}
j := list.selected + 1
if j >= len(list.Items) {
j = 0
}
list.Swap(list.selected, j)
list.selected = j
}
func (list *List) Next() {
list.selected = list.selected + 1
if list.selected >= len(list.Items) {
list.selected = 0
}
}
func (list *List) LongestLine() int {
maxLen := 0
for _, item := range list.Items {
if len(item.Text) > maxLen {
maxLen = len(item.Text)
}
}
return maxLen
}
func (list *List) Prev() {
list.selected = list.selected - 1
if list.selected < 0 {
list.selected = len(list.Items) - 1
}
}
func (list *List) Promote() {
if list.isUnselectable() {
return
}
j := list.selected - 1
if j < 0 {
j = len(list.Items) - 1
}
list.Swap(list.selected, j)
list.selected = j
}
func (list *List) Selected() *Item {
if list.isUnselectable() {
return nil
}
return list.Items[list.selected]
}
func (list *List) SetSelectedByItem(selectableItem *Item) {
for idx, item := range list.Items {
if item == selectableItem {
list.selected = idx
break
}
}
}
// Toggle switches the checked state of the currently-selected item
func (list *List) Toggle() {
if list.isUnselectable() {
return
}
list.Selected().Toggle()
}
func (list *List) UncheckedItems() []*Item {
items := []*Item{}
for _, item := range list.Items {
if !item.Checked {
items = append(items, item)
}
}
return items
}
func (list *List) Unselect() {
list.selected = -1
}
func (list *List) Update(text string) {
item := list.Selected()
if item == nil {
return
}
item.Text = text
}
/* -------------------- Sort Interface -------------------- */
func (list *List) Len() int {
return len(list.Items)
}
func (list *List) Less(i, j int) bool {
return list.Items[i].Text < list.Items[j].Text
}
func (list *List) Swap(i, j int) {
list.Items[i], list.Items[j] = list.Items[j], list.Items[i]
}
/* -------------------- Unexported Functions -------------------- */
func (list *List) isSelectable() bool {
return list.selected >= 0 && list.selected < len(list.Items)
}
func (list *List) isUnselectable() bool {
return !list.isSelectable()
}

View File

@ -7,6 +7,7 @@ import (
"github.com/gdamore/tcell"
"github.com/rivo/tview"
"github.com/senorprogrammer/wtf/cfg"
"github.com/senorprogrammer/wtf/checklist"
"github.com/senorprogrammer/wtf/wtf"
"gopkg.in/yaml.v2"
)
@ -39,7 +40,7 @@ type Widget struct {
app *tview.Application
filePath string
list *List
list checklist.Checklist
pages *tview.Pages
}
@ -49,7 +50,7 @@ func NewWidget(app *tview.Application, pages *tview.Pages) *Widget {
app: app,
filePath: wtf.Config.UString("wtf.mods.todo.filename"),
list: &List{selected: -1},
list: checklist.NewChecklist(),
pages: pages,
}
@ -67,7 +68,7 @@ func (widget *Widget) Refresh() {
widget.display()
}
func (widget *Widget) SetList(newList *List) {
func (widget *Widget) SetList(newList checklist.Checklist) {
widget.list = newList
}
@ -75,11 +76,11 @@ func (widget *Widget) SetList(newList *List) {
// edit opens a modal dialog that permits editing the text of the currently-selected item
func (widget *Widget) editItem() {
if widget.list.Selected() == nil {
if widget.list.SelectedItem() == nil {
return
}
form := widget.modalForm("Edit:", widget.list.Selected().Text)
form := widget.modalForm("Edit:", widget.list.SelectedItem().Text)
saveFctn := func() {
text := form.GetFormItem(0).(*tview.InputField).GetText()
@ -191,7 +192,7 @@ func (widget *Widget) newItem() {
saveFctn := func() {
text := form.GetFormItem(0).(*tview.InputField).GetText()
widget.list.Add(text)
widget.list.Add(false, text)
widget.persist()
widget.pages.RemovePage("modal")
widget.app.SetFocus(widget.View)

49
todoist/display.go Normal file
View File

@ -0,0 +1,49 @@
package todoist
import (
"fmt"
"github.com/rivo/tview"
"github.com/senorprogrammer/wtf/wtf"
)
const checkWidth = 4
func (widget *Widget) display() {
proj := widget.CurrentProject()
if proj == nil {
return
}
widget.View.SetTitle(fmt.Sprintf("%s- [green]%s[white] ", widget.Name, proj.Project.Name))
str := wtf.SigilStr(len(widget.projects), widget.idx, widget.View) + "\n"
maxLen := proj.LongestLine()
for index, item := range proj.tasks {
foreColor, backColor := "white", wtf.Config.UString("wtf.colors.background", "black")
if index == proj.index {
foreColor = wtf.Config.UString("wtf.colors.highlight.fore", "black")
backColor = wtf.Config.UString("wtf.colors.highlight.back", "orange")
}
row := fmt.Sprintf(
"[%s:%s]| | %s[white]",
foreColor,
backColor,
tview.Escape(item.Content),
)
_, _, w, _ := widget.View.GetInnerRect()
if w > maxLen {
maxLen = w
}
str = str + row + wtf.PadRow((checkWidth+len(item.Content)), (checkWidth+maxLen+1)) + "\n"
}
//widget.View.Clear()
widget.View.SetText(str)
}

110
todoist/project.go Normal file
View File

@ -0,0 +1,110 @@
package todoist
import (
"fmt"
"github.com/darkSasori/todoist"
)
type Project struct {
todoist.Project
index int
tasks []todoist.Task
}
func NewProject(id int) *Project {
project, err := todoist.GetProject(id)
if err != nil {
panic(err)
}
proj := &Project{
Project: project,
index: -1,
}
proj.loadTasks()
return proj
}
func (proj *Project) isFirst() bool {
return proj.index == 0
}
func (proj *Project) isLast() bool {
return proj.index >= len(proj.tasks)-1
}
func (proj *Project) up() {
proj.index = proj.index - 1
if proj.index < 0 {
proj.index = len(proj.tasks) - 1
}
}
func (proj *Project) down() {
if proj.index == -1 {
proj.index = 0
return
}
proj.index = proj.index + 1
if proj.index >= len(proj.tasks) {
proj.index = 0
}
}
func (proj *Project) loadTasks() {
tasks, err := todoist.ListTask(todoist.QueryParam{"project_id": fmt.Sprintf("%d", proj.ID)})
if err == nil {
proj.tasks = tasks
}
}
func (proj *Project) LongestLine() int {
maxLen := 0
for _, task := range proj.tasks {
if len(task.Content) > maxLen {
maxLen = len(task.Content)
}
}
return maxLen
}
func (proj *Project) currentTask() *todoist.Task {
if proj.index < 0 {
return nil
}
return &proj.tasks[proj.index]
}
func (proj *Project) closeSelectedTask() {
currTask := proj.currentTask()
if currTask != nil {
if err := currTask.Close(); err != nil {
return
}
proj.loadTasks()
}
}
func (proj *Project) deleteSelectedTask() {
currTask := proj.currentTask()
if currTask != nil {
if err := currTask.Delete(); err != nil {
return
}
proj.loadTasks()
}
}

176
todoist/widget.go Normal file
View File

@ -0,0 +1,176 @@
package todoist
import (
"os"
"github.com/darkSasori/todoist"
"github.com/gdamore/tcell"
"github.com/rivo/tview"
"github.com/senorprogrammer/wtf/wtf"
)
type Widget struct {
wtf.TextWidget
app *tview.Application
pages *tview.Pages
projects []*Project
idx int
}
func NewWidget(app *tview.Application, pages *tview.Pages) *Widget {
widget := Widget{
TextWidget: wtf.NewTextWidget(" Todoist ", "todoist", true),
app: app,
pages: pages,
}
todoist.Token = os.Getenv("WTF_TODOIST_TOKEN")
widget.projects = loadProjects()
widget.View.SetInputCapture(widget.keyboardIntercept)
return &widget
}
/* -------------------- Exported Functions -------------------- */
func (widget *Widget) CurrentProject() *Project {
return widget.ProjectAt(widget.idx)
}
func (widget *Widget) ProjectAt(idx int) *Project {
if len(widget.projects) == 0 {
return nil
}
return widget.projects[idx]
}
func (w *Widget) NextProject() {
w.idx = w.idx + 1
if w.idx == len(w.projects) {
w.idx = 0
}
w.display()
}
func (w *Widget) PreviousProject() {
w.idx = w.idx - 1
if w.idx < 0 {
w.idx = len(w.projects) - 1
}
w.display()
}
func (w *Widget) Refresh() {
if w.Disabled() || w.CurrentProject() == nil {
return
}
w.UpdateRefreshedAt()
w.display()
}
/* -------------------- Keyboard Movement -------------------- */
// Down selects the next item in the list
func (w *Widget) Down() {
w.CurrentProject().down()
w.display()
}
// Up selects the previous item in the list
func (w *Widget) Up() {
w.CurrentProject().up()
w.display()
}
// Close closes the currently-selected task in the currently-selected project
func (w *Widget) Close() {
w.CurrentProject().closeSelectedTask()
if w.CurrentProject().isLast() {
w.Up()
return
}
w.Down()
}
// Delete deletes the currently-selected task in the currently-selected project
func (w *Widget) Delete() {
w.CurrentProject().deleteSelectedTask()
if w.CurrentProject().isLast() {
w.Up()
return
}
w.Down()
}
/* -------------------- Unexported Functions -------------------- */
func (w *Widget) keyboardIntercept(event *tcell.EventKey) *tcell.EventKey {
if len(w.projects) == 0 {
return event
}
switch string(event.Rune()) {
case "r":
w.Refresh()
return nil
case "d":
w.Delete()
return nil
case "c":
w.Close()
return nil
}
switch w.vimBindings(event) {
case tcell.KeyLeft:
w.PreviousProject()
return nil
case tcell.KeyRight:
w.NextProject()
return nil
case tcell.KeyUp:
w.Up()
return nil
case tcell.KeyDown:
w.Down()
return nil
}
return event
}
// TODO: Rename this List to Projects so the internal can be Checklist
func loadProjects() []*Project {
projects := []*Project{}
for _, id := range wtf.Config.UList("wtf.mods.todoist.projects") {
proj := NewProject(id.(int))
projects = append(projects, proj)
}
return projects
}
func (w *Widget) vimBindings(event *tcell.EventKey) tcell.Key {
switch string(event.Rune()) {
case "h":
return tcell.KeyLeft
case "l":
return tcell.KeyRight
case "k":
return tcell.KeyUp
case "j":
return tcell.KeyDown
}
return event.Key()
}

84
travisci/client.go Normal file
View File

@ -0,0 +1,84 @@
package travisci
import (
"bytes"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"net/http"
"net/url"
"os"
)
const APIEnvToken = "WTF_TRAVIS_API_TOKEN"
func BuildsFor() (*Builds, error) {
builds := &Builds{}
resp, err := travisRequest("builds")
if err != nil {
return builds, err
}
parseJson(&builds, resp.Body)
return builds, nil
}
/* -------------------- Unexported Functions -------------------- */
var (
travisAPIURL = &url.URL{Scheme: "https", Host: "api.travis-ci.org", Path: "/"}
)
func travisRequest(path string) (*http.Response, error) {
params := url.Values{}
params.Add("limit", "10")
url := travisAPIURL.ResolveReference(&url.URL{Path: path, RawQuery: params.Encode()})
req, err := http.NewRequest("GET", url.String(), nil)
req.Header.Add("Accept", "application/json")
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Travis-API-Version", "3")
bearer := fmt.Sprintf("token %s", apiToken())
req.Header.Add("Authorization", bearer)
if err != nil {
return nil, err
}
httpClient := &http.Client{}
resp, err := httpClient.Do(req)
if err != nil {
return nil, err
}
if resp.StatusCode < 200 || resp.StatusCode > 299 {
return nil, fmt.Errorf(resp.Status)
}
return resp, nil
}
func apiToken() string {
return os.Getenv(APIEnvToken)
}
func parseJson(obj interface{}, text io.Reader) {
jsonStream, err := ioutil.ReadAll(text)
if err != nil {
panic(err)
}
decoder := json.NewDecoder(bytes.NewReader(jsonStream))
for {
if err := decoder.Decode(obj); err == io.EOF {
break
} else if err != nil {
panic(err)
}
}
}

25
travisci/travis.go Normal file
View File

@ -0,0 +1,25 @@
package travisci
type Builds struct {
Builds []Build `json:"builds"`
}
type Build struct {
CreatedBy Owner `json:"created_by"`
Branch Branch `json:"branch"`
Number string `json:"number"`
Repository Repository `json:"repository"`
State string `json:"state"`
}
type Owner struct {
Login string `json:"login"`
}
type Branch struct {
Name string `json:"name"`
}
type Repository struct {
Name string `json:"name"`
}

82
travisci/widget.go Normal file
View File

@ -0,0 +1,82 @@
package travisci
import (
"fmt"
"github.com/senorprogrammer/wtf/wtf"
)
type Widget struct {
wtf.TextWidget
}
func NewWidget() *Widget {
widget := Widget{
TextWidget: wtf.NewTextWidget(" Travis CI", "travisci", false),
}
return &widget
}
/* -------------------- Exported Functions -------------------- */
func (widget *Widget) Refresh() {
if widget.Disabled() {
return
}
builds, err := BuildsFor()
widget.UpdateRefreshedAt()
widget.View.SetTitle(fmt.Sprintf("%s - Builds", widget.Name))
var content string
if err != nil {
widget.View.SetWrap(true)
content = err.Error()
} else {
widget.View.SetWrap(false)
content = widget.contentFrom(builds)
}
widget.View.SetText(content)
}
/* -------------------- Unexported Functions -------------------- */
func (widget *Widget) contentFrom(builds *Builds) string {
var str string
for _, build := range builds.Builds {
str = str + fmt.Sprintf(
"[%s] %s-%s (%s) [white]%s\n",
buildColor(&build),
build.Repository.Name,
build.Number,
build.Branch.Name,
build.CreatedBy.Login,
)
}
return str
}
func buildColor(build *Build) string {
switch build.State {
case "broken":
return "red"
case "failed":
return "red"
case "failing":
return "red"
case "pending":
return "yellow"
case "started":
return "yellow"
case "fixed":
return "green"
case "passed":
return "green"
default:
return "white"
}
}

2
vendor/github.com/darkSasori/todoist/.gitignore generated vendored Normal file
View File

@ -0,0 +1,2 @@
*.out
vendor/*

19
vendor/github.com/darkSasori/todoist/.travis.yml generated vendored Normal file
View File

@ -0,0 +1,19 @@
language: go
notifications:
email: false
go:
- "1.10.3"
- master
before_install:
- curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
- go get -u github.com/golang/lint/golint
install:
- dep ensure
script:
- golint -set_exit_status
- go test -v

21
vendor/github.com/darkSasori/todoist/Gopkg.lock generated vendored Normal file
View File

@ -0,0 +1,21 @@
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
[[projects]]
branch = "master"
name = "github.com/darkSasori/todoist"
packages = ["."]
revision = "ab3a9f0b9d551ab4e57f1caae9bb20d5aa51ec10"
[[projects]]
branch = "v1"
name = "gopkg.in/jarcoal/httpmock.v1"
packages = ["."]
revision = "16f9a43967d613f0adc2000f0094a17b9f6c4c20"
[solve-meta]
analyzer-name = "dep"
analyzer-version = 1
inputs-digest = "4d0d4d6dd7b4141be119cb48281ea7c10f05d3037c0e4ac49560cf4af21917a7"
solver-name = "gps-cdcl"
solver-version = 1

34
vendor/github.com/darkSasori/todoist/Gopkg.toml generated vendored Normal file
View File

@ -0,0 +1,34 @@
# Gopkg.toml example
#
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
# for detailed Gopkg.toml documentation.
#
# required = ["github.com/user/thing/cmd/thing"]
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
#
# [[constraint]]
# name = "github.com/user/project"
# version = "1.0.0"
#
# [[constraint]]
# name = "github.com/user/project2"
# branch = "dev"
# source = "github.com/myfork/project2"
#
# [[override]]
# name = "github.com/x/y"
# version = "2.4.0"
#
# [prune]
# non-go = false
# go-tests = true
# unused-packages = true
[[constraint]]
branch = "v1"
name = "gopkg.in/jarcoal/httpmock.v1"
[prune]
go-tests = true
unused-packages = true

21
vendor/github.com/darkSasori/todoist/LICENSE generated vendored Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2018 Lineu Felipe
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

6
vendor/github.com/darkSasori/todoist/README.md generated vendored Normal file
View File

@ -0,0 +1,6 @@
# todoist
[![godoc](https://godoc.org/github.com/darkSasori/todoist?status.svg)](https://godoc.org/github.com/darkSasori/todoist)
[![Build Status](https://travis-ci.org/darkSasori/todoist.svg?branch=master)](https://travis-ci.org/darkSasori/todoist)
[![Go Report Card](https://goreportcard.com/badge/github.com/darkSasori/todoist)](https://goreportcard.com/report/github.com/darkSasori/todoist)
Unofficial todoist api implementation

149
vendor/github.com/darkSasori/todoist/projects.go generated vendored Normal file
View File

@ -0,0 +1,149 @@
package todoist
import (
"encoding/json"
"fmt"
"io"
"net/http"
)
// Project is a model of todoist project entity
type Project struct {
ID int `json:"id"`
Name string `json:"name"`
CommentCount int `json:"comment_count"`
Order int `json:"order"`
Indent int `json:"indent"`
}
func decodeProject(body io.ReadCloser) (Project, error) {
defer body.Close()
decoder := json.NewDecoder(body)
var project Project
if err := decoder.Decode(&project); err != nil {
return Project{}, err
}
return project, nil
}
// ListProject return all projects
//
// Example:
// todoist.Token = "your token"
// projects, err := todoist.ListProject()
// if err != nil {
// panic(err)
// }
// fmt.Println(projects)
func ListProject() ([]Project, error) {
res, err := makeRequest(http.MethodGet, "projects", nil)
if err != nil {
return []Project{}, err
}
defer res.Body.Close()
decoder := json.NewDecoder(res.Body)
var projects []Project
if err := decoder.Decode(&projects); err != nil {
return []Project{}, err
}
return projects, nil
}
// GetProject return a project by id
//
// Example:
// todoist.Token = "your token"
// project, err := todoist.GetProject(1)
// if err != nil {
// panic(err)
// }
// fmt.Println(project)
func GetProject(id int) (Project, error) {
path := fmt.Sprintf("projects/%d", id)
res, err := makeRequest(http.MethodGet, path, nil)
if err != nil {
return Project{}, err
}
return decodeProject(res.Body)
}
// CreateProject create a new project with a name
//
// Example:
// todoist.Token = "your token"
// project, err := todoist.CreateProject("New Project")
// if err != nil {
// panic(err)
// }
// fmt.Println(project)
func CreateProject(name string) (Project, error) {
project := struct {
Name string `json:"name"`
}{
name,
}
res, err := makeRequest(http.MethodPost, "projects", project)
if err != nil {
return Project{}, err
}
return decodeProject(res.Body)
}
// Delete project
//
// Example:
// todoist.Token = "your token"
// project, err := todoist.GetProject(1)
// if err != nil {
// panic(err)
// }
// err = project.Delete()
// if err != nil {
// panic(err)
// }
func (p Project) Delete() error {
path := fmt.Sprintf("projects/%d", p.ID)
_, err := makeRequest(http.MethodDelete, path, nil)
if err != nil {
return err
}
return nil
}
// Update project
//
// Example:
// todoist.Token = "your token"
// project, err := todoist.GetProject(1)
// if err != nil {
// panic(err)
// }
// project.Name = "updated"
// err = project.Update()
// if err != nil {
// panic(err)
// }
// fmt.Println(project)
func (p Project) Update() error {
path := fmt.Sprintf("projects/%d", p.ID)
project := struct {
Name string `json:"name"`
}{
p.Name,
}
_, err := makeRequest(http.MethodPost, path, project)
if err != nil {
return err
}
return nil
}

158
vendor/github.com/darkSasori/todoist/task.go generated vendored Normal file
View File

@ -0,0 +1,158 @@
package todoist
import (
"encoding/json"
"fmt"
"io"
"net/http"
)
// Task is a model of todoist project entity
type Task struct {
ID int `json:"id"`
CommentCount int `json:"comment_count"`
Completed bool `json:"completed"`
Content string `json:"content"`
Indent int `json:"indent"`
LabelIDs []int `json:"label_ids"`
Order int `json:"order"`
Priority int `json:"priority"`
ProjectID int `json:"project_id"`
Due Due `json:"due"`
}
// Due is a model of todoist project entity
type Due struct {
String string `json:"string"`
Date string `json:"date"`
Datetime CustomTime `json:"datetime"`
Timezone string `json:"timezone"`
}
func (t Task) taskSave() taskSave {
return taskSave{
t.Content,
t.ProjectID,
t.Order,
t.LabelIDs,
t.Priority,
t.Due.String,
t.Due.Datetime,
"en",
}
}
func decodeTask(body io.ReadCloser) (Task, error) {
defer body.Close()
decoder := json.NewDecoder(body)
var task Task
if err := decoder.Decode(&task); err != nil {
return Task{}, err
}
return task, nil
}
// QueryParam is a map[string]string to build http query
type QueryParam map[string]string
func (qp QueryParam) String() string {
if len(qp) == 0 {
return ""
}
ret := "?"
for key, value := range qp {
if ret != "?" {
ret = ret + "&"
}
ret = ret + key + "=" + value
}
return ret
}
// ListTask return all task, you can filter using QueryParam
// See documentation: https://developer.todoist.com/rest/v8/#get-tasks
func ListTask(qp QueryParam) ([]Task, error) {
path := fmt.Sprintf("tasks%s", qp)
res, err := makeRequest(http.MethodGet, path, nil)
if err != nil {
return []Task{}, err
}
defer res.Body.Close()
decoder := json.NewDecoder(res.Body)
var tasks []Task
if err := decoder.Decode(&tasks); err != nil {
return []Task{}, err
}
return tasks, nil
}
// GetTask return a task by id
func GetTask(id int) (Task, error) {
path := fmt.Sprintf("tasks/%d", id)
res, err := makeRequest(http.MethodGet, path, nil)
if err != nil {
return Task{}, err
}
return decodeTask(res.Body)
}
// CreateTask create a new task
func CreateTask(task Task) (Task, error) {
res, err := makeRequest(http.MethodPost, "tasks", task.taskSave())
if err != nil {
return Task{}, err
}
return decodeTask(res.Body)
}
// Delete remove a task
func (t Task) Delete() error {
path := fmt.Sprintf("tasks/%d", t.ID)
_, err := makeRequest(http.MethodDelete, path, nil)
if err != nil {
return err
}
return nil
}
// Update a task
func (t Task) Update() error {
path := fmt.Sprintf("tasks/%d", t.ID)
_, err := makeRequest(http.MethodPost, path, t.taskSave())
if err != nil {
return err
}
return nil
}
// Close mask task as done
func (t Task) Close() error {
path := fmt.Sprintf("tasks/%d/close", t.ID)
_, err := makeRequest(http.MethodPost, path, nil)
if err != nil {
return err
}
return nil
}
// Reopen a task
func (t Task) Reopen() error {
path := fmt.Sprintf("tasks/%d/reopen", t.ID)
_, err := makeRequest(http.MethodPost, path, nil)
if err != nil {
return err
}
return nil
}

145
vendor/github.com/darkSasori/todoist/todoist.go generated vendored Normal file
View File

@ -0,0 +1,145 @@
package todoist
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"strings"
"time"
)
// Token save the personal token from todoist
var Token string
var todoistURL = "https://beta.todoist.com/API/v8/"
func makeRequest(method, endpoint string, data interface{}) (*http.Response, error) {
url := todoistURL + endpoint
body := bytes.NewBuffer([]byte{})
if data != nil {
json, err := json.Marshal(data)
if err != nil {
return nil, err
}
body = bytes.NewBuffer(json)
}
req, err := http.NewRequest(method, url, body)
if err != nil {
return nil, err
}
bearer := fmt.Sprintf("Bearer %s", Token)
req.Header.Add("Authorization", bearer)
if data != nil {
req.Header.Add("Content-Type", "application/json")
}
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
return nil, err
}
if res.StatusCode >= 400 {
defer res.Body.Close()
str, err := ioutil.ReadAll(res.Body)
if err != nil {
return nil, err
}
return nil, fmt.Errorf(string(str))
}
return res, nil
}
const ctLayout = "2006-01-02T15:04:05+00:00"
// CustomTime had a custom json date format
type CustomTime struct {
time.Time
}
// UnmarshalJSON convert from []byte to CustomTime
func (ct *CustomTime) UnmarshalJSON(b []byte) (err error) {
s := strings.Trim(string(b), "\"")
if s == "null" {
ct.Time = time.Time{}
return nil
}
ct.Time, err = time.Parse(ctLayout, s)
return err
}
// MarshalJSON convert CustomTime to []byte
func (ct CustomTime) MarshalJSON() ([]byte, error) {
if ct.Time.IsZero() {
return []byte("null"), nil
}
return []byte(`"` + ct.Time.Format(ctLayout) + `"`), nil
}
type taskSave struct {
Content string `json:"content"`
ProjectID int `json:"project_id,omitempty"`
Order int `json:"order,omitempty"`
LabelIDs []int `json:"label_ids,omitempty"`
Priority int `json:"priority,omitempty"`
DueString string `json:"due_string,omitempty"`
DueDateTime CustomTime `json:"due_datetime,omitempty"`
DueLang string `json:"due_lang,omitempty"`
}
func (ts taskSave) MarshalJSON() ([]byte, error) {
buffer := bytes.NewBufferString("{")
if ts.Content == "" {
return nil, fmt.Errorf("Content is empty")
}
buffer.WriteString(fmt.Sprintf("\"content\":\"%s\"", ts.Content))
if ts.ProjectID != 0 {
buffer.WriteString(fmt.Sprintf(",\"project_id\":%d", ts.ProjectID))
}
if ts.Order != 0 {
buffer.WriteString(fmt.Sprintf(",\"order\":%d", ts.Order))
}
if !ts.DueDateTime.IsZero() {
buffer.WriteString(",\"due_datetime\":")
json, err := json.Marshal(ts.DueDateTime)
if err != nil {
return nil, err
}
buffer.Write(json)
}
if len(ts.LabelIDs) != 0 {
buffer.WriteString(",\"label_ids\":")
json, err := json.Marshal(ts.LabelIDs)
if err != nil {
return nil, err
}
buffer.Write(json)
}
if ts.Priority != 0 {
buffer.WriteString(fmt.Sprintf(",\"priority\":%d", ts.Priority))
}
if ts.DueString != "" {
buffer.WriteString(fmt.Sprintf(",\"due_string\":\"%s\"", ts.DueString))
}
if ts.DueLang != "" {
buffer.WriteString(fmt.Sprintf(",\"due_lang\":\"%s\"", ts.DueLang))
}
buffer.WriteString("}")
return buffer.Bytes(), nil
}

View File

@ -5,6 +5,8 @@ go:
- 1.6.x
- 1.7.x
- 1.8.x
- 1.9.x
- 1.10.x
- master
before_install:

View File

@ -1,4 +1,4 @@
## tcell
## tcell <img src=tcell.png align=right>
[![Linux Status](https://img.shields.io/travis/gdamore/tcell.svg?label=linux)](https://travis-ci.org/gdamore/tcell)
[![Windows Status](https://img.shields.io/appveyor/ci/gdamore/tcell.svg?label=windows)](https://ci.appveyor.com/project/gdamore/tcell)
@ -9,12 +9,6 @@
[![codecov](https://codecov.io/gh/gdamore/tcell/branch/master/graph/badge.svg)](https://codecov.io/gh/gdamore/tcell)
> _Tcell is a work in progress (Gamma).
> Please use with caution; interfaces may change in before final release.
> That said, our confidence in Tcell's stability is increasing. If you
> would like to use it in your own application, it is recommended that
> you drop a message to garrett@damore.org before commitment._
Package tcell provides a cell based view for text terminals, like xterm.
It was inspired by termbox, but differs from termbox in some important
ways. It also adds substantial functionality beyond termbox.
@ -27,32 +21,30 @@ ways. It also adds substantial functionality beyond termbox.
* [gomatrix](https://github.com/gdamore/gomatrix) - converted from Termbox
* [micro](https://github.com/zyedidia/micro/) - lightweight text editor with syntax-highlighting and themes
* [godu](https://github.com/viktomas/godu) - simple golang utility helping to discover large files/folders.
* [tview](https://github.com/rivo/tview) - rich interactive widgets for terminal UIs
* [tui-go](https://github.com/marcusolsson/tui-go) - UI library for terminal apps
* [gomandelbrot](https://github.com/rgm3/gomandelbrot) - Mandelbrot!
* [WTF](https://github.com/senorprogrammer/wtf)- Personal information dashboard for your terminal
## Pure Go Terminfo Database
First, it includes a full parser and expander for terminfo capability strings,
so that it can avoid hard coding escape strings for formatting. It also favors
portability, and includes support for all POSIX systems, at the slight expense
of needing cgo support for terminal initializations. (This may be corrected
when Go provides standard support for terminal handling via termio ioctls on
all POSIX platforms.) The database itself, while built using CGO, as well
as the parser for it, is implemented in Pure Go.
portability, and includes support for all POSIX systems.
The database is also flexible & extensible, and can modified by either running a
program to build the database, or hand editing of simple JSON files.
The database is also flexible & extensible, and can modified by either running
a program to build the entire database, or an entry for just a single terminal.
## More Portable
Tcell is portable to a wider variety of systems. It relies on standard
POSIX supported function calls (on POSIX platforms) for setting terminal
modes, which leads to improved support for a broader array of platforms.
This does come at the cost of requiring your code to be able to use CGO, but
we believe that the vastly improved portability justifies this
requirement. Note that the functions called are part of the standard C
library, so there shouldn't be any additional external requirements beyond
that required for every POSIX program.
Tcell is portable to a wider variety of systems. Tcell is believed
to work with all of the systems officially supported by golang with
the exception of nacl (which lacks any kind of a terminal interface).
(Plan9 is not supported by Tcell, but it is experimental status only
in golang.) For all of these systems *except Solaris/illumos*, Tcell
is pure Go, with no need for CGO.
## No async IO
## No Async IO
Tcell is able to operate without requiring SIGIO signals (unlike Termbox),
or asynchronous I/O, and can instead use standard Go file
@ -63,7 +55,7 @@ to fewer surprises.
## Richer Unicode & non-Unicode support
Tcell includes enhanced support for Unicode, include wide characters and
Tcell includes enhanced support for Unicode, including wide characters and
combining characters, provided your terminal can support them. Note that
Windows terminals generally don't support the full Unicode repertoire.
@ -75,10 +67,10 @@ drawing certain characters.
## More Function Keys
It also has richer support for a larger number of
special keys that some terminals can send.
It also has richer support for a larger number of special keys that some
terminals can send.
## Better color handling
## Better Color Handling
Tcell will respect your terminal's color space as specified within your terminfo
entries, so that for example attempts to emit color sequences on VT100 terminals
@ -88,22 +80,15 @@ In Windows mode, Tcell supports 16 colors, bold, dim, and reverse,
instead of just termbox's 8 colors with reverse. (Note that there is some
conflation with bold/dim and colors.)
Tcell maps 16 colors down to 8, for Terminals that need it. (The upper
Tcell maps 16 colors down to 8, for terminals that need it. (The upper
8 colors are just brighter versions of the lower 8.)
## Better mouse support
## Better Mouse Support
Tcell supports enhanced mouse tracking mode, so your application can receive
regular mouse motion events, and wheel events, if your terminal supports it.
## Why not just patch termbox-go?
I started this project originally by submitting patches to the author of
go-termbox, but due to some fundamental differences of opinion, I thought
it might be simpler just to start from scratch. At this point, Tcell has
far exceeded the capabilities of termbox.
## Termbox compatibility
## Termbox Compatibility
A compatibility layer for termbox is provided in the compat
directory. To use it, try importing "github.com/gdamore/tcell/termbox"
@ -174,18 +159,18 @@ avoiding repeated sequences or drawing the same cell on refresh updates.
(Not relevent for Windows users.)
The Terminfo implementation operates with two forms of database. The first
is the database.go file, which contains a number of real database entries
is the built-in go database, which contains a number of real database entries
that are compiled into the program directly. This should minimize calling
out to database file searches.
The second is a JSON file, that contains the same information, which can
be located either by the $TCELLDB environment file, $HOME/.tcelldb, or is
located in the Go source directory as database.json.
The second is in the form of JSON files, that contain the same information,
which can be located either by the $TCELLDB environment file, $HOME/.tcelldb,
or is located in the Go source directory as database.json.
These files (both the Go database.go and the database.json) file can be
generated using the mkinfo.go program. If you need to regnerate the
entire set for some reason, run the mkdatabase.sh file. The generation
uses the terminfo routines on the system to populate the data files.
These files (both the Go and the JSON files) can be generated using the
mkinfo.go program. If you need to regnerate the entire set for some reason,
run the mkdatabase.sh file. The generation uses the infocmp(1) program on
the system to collect the necessary information.
The mkinfo.go program can also be used to generate specific database entries
for named terminals, in case your favorite terminal is missing. (If you
@ -227,32 +212,27 @@ and examine "physical" screen contents.
## Platforms
### Systems (Linux, FreeBSD, MacOS, Solaris, etc.)
### POSIX (Linux, FreeBSD, MacOS, Solaris, etc.)
On POSIX systems, a POSIX termios implementation with /dev/tty is required.
On a small subset of these platforms (such as Solaris/illumos), we require
cgo to run, in order to access termios. (Note that Linux and BSD systems
do not require CGO for most purposes.)
For mainstream systems with a suitably well defined system call interface
to tty settings, everything works using pure Go.
(Note: CGO support is required if you wish to rebuild the terminal database
from the system's native terminfo binary files. This is because we use the
system's native libterminfo to access that binary data. We probably could
eliminate that in the future by using a terminfo decompiler such as infocmp.)
For the remainder (right now means only Solaris/illumos) we use POSIX function
calls to manage termios, which implies that CGO is required on those platforms.
### Windows
Windows console mode applications are supported. Unfortunately mintty
and other cygwin style applications are not supported.
Modern console applications like ConEmu support all the good features
(resize, mouse tracking, etc.)
Modern console applications like ConEmu, as well as the Windows 10
console itself, support all the good features (resize, mouse tracking, etc.)
I haven't figured out how to cleanly resolve the dichotomy between cygwin
style termios and the Windows Console API; it seems that perhaps nobody else
has either. If anyone has suggestions, let me know! Really, if you're
using a Windows application, you should use the native Windows console or a
fully compatible console implementation. Hopefully the Windows 10 console
is more functional in this regard.
fully compatible console implementation.
### Plan9 and Native Client (Nacl)
@ -260,3 +240,15 @@ The nacl and plan9 platforms won't work, but compilation stubs are supplied
for folks that want to include parts of this in software targetting those
platforms. The Simulation screen works, but as Tcell doesn't know how to
allocate a real screen object on those platforms, NewScreen() will fail.
If anyone has wisdom about how to improve support for either of these,
please let me know. PRs are especially welcome.
### Commercial Support
This software is absolutely free, but if you want to obtain commercial
support (giving prioritized access to the developer, etc. on an hourly
rate), please drop a line to info@staysail.tech
I also welcome donations at Patreon, if you just want to feel good about
defraying development costs: https://www.patreon.com/gedamore

View File

@ -48,12 +48,13 @@ func (cb *CellBuffer) SetContent(x int, y int,
if x >= 0 && y >= 0 && x < cb.w && y < cb.h {
c := &cb.cells[(y*cb.w)+x]
c.currComb = append([]rune{}, combc...)
i := 0
for i < len(combc) {
r := combc[i]
for i < len(c.currComb) {
r := c.currComb[i]
if runewidth.RuneWidth(r) != 0 {
// not a combining character, yank it
combc = append(combc[:i-1], combc[i+1:]...)
c.currComb = append(c.currComb[:i-1], c.currComb[i+1:]...)
continue
}
i++
@ -63,7 +64,6 @@ func (cb *CellBuffer) SetContent(x int, y int,
c.width = runewidth.RuneWidth(mainc)
}
c.currMain = mainc
c.currComb = combc
c.currStyle = style
}
}

View File

@ -17,11 +17,11 @@
package tcell
import (
"errors"
"sync"
"syscall"
"unicode/utf16"
"unsafe"
"errors"
)
type cScreen struct {
@ -183,7 +183,7 @@ func (s *cScreen) CharacterSet() string {
}
func (s *cScreen) EnableMouse() {
s.setInMode(modeResizeEn | modeMouseEn)
s.setInMode(modeResizeEn | modeMouseEn | modeExtndFlg)
}
func (s *cScreen) DisableMouse() {
@ -565,8 +565,14 @@ func (s *cScreen) getConsoleInput() error {
if krec.ch != 0 {
// synthesized key code
for krec.repeat > 0 {
// convert shift+tab to backtab
if mod2mask(krec.mod) == ModShift && krec.ch == vkTab {
s.PostEvent(NewEventKey(KeyBacktab, 0,
ModNone))
} else {
s.PostEvent(NewEventKey(KeyRune, rune(krec.ch),
mod2mask(krec.mod)))
}
krec.repeat--
}
return nil
@ -920,6 +926,7 @@ func (s *cScreen) clearScreen(style Style) {
}
const (
modeExtndFlg uint32 = 0x0080
modeMouseEn uint32 = 0x0010
modeResizeEn uint32 = 0x0008
modeWrapEOL uint32 = 0x0002

View File

@ -1,4 +1,4 @@
// Copyright 2015 The TCell Authors
// Copyright 2018 The TCell Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use file except in compliance with the License.
@ -25,7 +25,7 @@
// of course. (Windows, XTerm, and iTerm 2 are known to work very well.)
//
// If the environment is not Unicode by default, such as an ISO8859 based
// locale or GB18030, Tcell can convert input and outupt, so that your
// locale or GB18030, Tcell can convert input and output, so that your
// terminal can operate in whatever locale is most convenient, while the
// application program can just assume "everything is UTF-8". Reasonable
// defaults are used for updating characters to something suitable for
@ -34,6 +34,14 @@
// not available. If no ACS is available, then some ASCII fallbacks will
// be used.
//
// Note that support for non-UTF-8 locales (other than C) must be enabled
// by the application using RegisterEncoding() -- we don't have them all
// enabled by default to avoid bloating the application unneccessarily.
// (These days UTF-8 is good enough for almost everyone, and nobody should
// be using legacy locales anymore.) Also, actual glyphs for various code
// point will only be displayed if your terminal or emulator (or the font
// the emulator is using) supports them.
//
// A rich set of keycodes is supported, with support for up to 65 function
// keys, and various other special keys.
//

View File

@ -109,6 +109,7 @@ type simscreen struct {
func (s *simscreen) Init() error {
s.evch = make(chan Event, 10)
s.quit = make(chan struct{})
s.fillchar = 'X'
s.fillstyle = StyleDefault
s.mouse = false
@ -369,7 +370,7 @@ func (s *simscreen) InjectMouse(x, y int, buttons ButtonMask, mod ModMask) {
}
func (s *simscreen) InjectKey(key Key, r rune, mod ModMask) {
ev := NewEventKey(KeyRune, r, ModNone)
ev := NewEventKey(key, r, mod)
s.PostEvent(ev)
}
@ -441,8 +442,10 @@ func (s *simscreen) SetSize(w, h int) {
newc[(row*w)+col] = s.front[(row*s.physw)+col]
}
}
s.physw = w
s.physh = h
s.cursorx, s.cursory = -1, -1
s.physw, s.physh = w, h
s.front = newc
s.back.Resize(w, h)
s.Unlock()
}

BIN
vendor/github.com/gdamore/tcell/tcell.png generated vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

93
vendor/github.com/gdamore/tcell/tcell.svg generated vendored Normal file
View File

@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
id="svg8"
version="1.1"
viewBox="0 0 210 297"
height="297mm"
width="210mm">
<defs
id="defs2">
<linearGradient
id="linearGradient2680">
<stop
id="stop2676"
offset="0"
style="stop-color:#ababab;stop-opacity:1;" />
<stop
id="stop2678"
offset="1"
style="stop-color:#ababab;stop-opacity:0;" />
</linearGradient>
<marker
style="overflow:visible"
id="Arrow1Lstart"
refX="0.0"
refY="0.0"
orient="auto">
<path
transform="scale(0.8) translate(12.5,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
id="path848" />
</marker>
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.28804762,0,94.764912)"
r="19.622099"
fy="133.10568"
fx="111.58373"
cy="133.10568"
cx="111.58373"
id="radialGradient2684"
xlink:href="#linearGradient2680" />
</defs>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1">
<rect
y="99.44445"
x="31.750006"
height="86.430557"
width="129.64584"
id="rect1130"
style="opacity:1;fill:#5d6c53;fill-opacity:1;stroke:#244f24;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<text
transform="scale(0.99941234,1.000588)"
id="text1128"
y="160.47581"
x="44.689861"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:46.0962944px;line-height:1.25;font-family:'Glass TTY VT220';-inkscape-font-specification:'Glass TTY VT220, Medium';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#5ef86d;fill-opacity:1;stroke:#59ff32;stroke-width:0.80994618;stroke-opacity:0.94520545;"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:46.0962944px;font-family:'Glass TTY VT220';-inkscape-font-specification:'Glass TTY VT220, Medium';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#5ef86d;fill-opacity:1;stroke:#59ff32;stroke-width:0.80994618;stroke-opacity:0.94520545;"
y="160.47581"
x="44.689861"
id="tspan1126">tcell</tspan></text>
<flowRoot
style="fill:black;fill-opacity:1;stroke:none;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px"
id="flowRoot1132"
xml:space="preserve"><flowRegion
id="flowRegion1134"><rect
y="432.51968"
x="290"
height="160"
width="330"
id="rect1136" /></flowRegion><flowPara
id="flowPara1138"></flowPara></flowRoot> </g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

Some files were not shown because too many files have changed in this diff Show More