-
-
Notifications
You must be signed in to change notification settings - Fork 622
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
progress bar (WIP) #3
Changes from 6 commits
753ee45
a0f169f
2106c57
5d3e29f
3aaab27
845464b
c954ed4
f93b307
b0fc294
4cfe8aa
c0333a9
16c60ef
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
{ | ||
"presets": ["babel-preset-react"], | ||
"env": { | ||
"development": { | ||
"plugins": [ | ||
[ | ||
"transform-react-jsx", | ||
{ | ||
"pragma": "h" | ||
} | ||
] | ||
] | ||
} | ||
} | ||
} | ||
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
The Bar component represents progress. See examples/progress.js for an example app. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add a title: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done. ProgressBar. |
||
|
||
## Usage | ||
|
||
```js | ||
const {h, Text, Bar} = require('ink'); | ||
|
||
<Bar | ||
char="x" | ||
progress={0.5} | ||
left={5} | ||
right={0} | ||
green | ||
/> | ||
``` | ||
|
||
## Props | ||
|
||
### char | ||
|
||
The character to use for each item in the Bar. Defaults to █ (block). | ||
|
||
### progress | ||
|
||
The percentage (between 0 and 1) of progress in the Bar. | ||
|
||
### left/right | ||
|
||
The number of characters to subtract from each side of the Bar. examples/progress.js demonstrates this. Commonly used if you want text before/after the progress bar on the same line. | ||
|
||
|
||
### {color} | ||
|
||
Pass any chalk colors (e.g. `green`, `bgBlue`), similar to Text. | ||
|
||
### ... | ||
|
||
Any other props are passed to Text as-is. | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
/* @jsx h */ | ||
const {h, mount, Component, Text, Bar} = require('../'); | ||
|
||
const MAX = 20; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Max what? Would be nice if the variable name was more descriptive. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Tried a different example. |
||
|
||
class ProgressApp extends Component { | ||
constructor() { | ||
super(); | ||
|
||
this.state = { | ||
i: 0 | ||
}; | ||
} | ||
|
||
render() { | ||
const text = `Running `; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would just inline this. Everything else is inline. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's used in two places, should I hard code the length? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oops, didn't notice that. Would be nice if the bar just calculated the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It'd have to know what else is on the line, or take the other content as a prop and render it itself, and it couldn't be custom components, and it might be a with multiple to have different colors. It could have you either pass leftText (string) or leftSize (number), and if you pass leftText it'd render it. This seems confusing though. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think Ink should handle that for us. That's the behavior I expected. That would mean Ink would provide us the available screen space instead of us using There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Very good idea, I'd want that to be implemented natively too. Although I've been thinking and didn't come up with a way to solve this properly. Opened #5 to discuss this. |
||
return ( | ||
<div> | ||
<Text green> | ||
{text} | ||
</Text> | ||
<Bar | ||
blue | ||
left={text.length} | ||
percent={this.state.i / MAX} | ||
/> | ||
</div> | ||
); | ||
} | ||
|
||
componentDidMount() { | ||
this.timer = setInterval(() => { | ||
const i = this.state.i + 1; | ||
this.setState({i}, () => { | ||
if (i === MAX) { | ||
// eslint-disable-next-line unicorn/no-process-exit | ||
process.exit(); | ||
} | ||
}); | ||
}, 100); | ||
} | ||
|
||
componentWillUnmount() { | ||
clearInterval(this.timer); | ||
} | ||
} | ||
|
||
mount(<ProgressApp/>, process.stdout); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
#!/bin/bash | ||
|
||
./node_modules/.bin/babel-node examples/$1.js | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -11,6 +11,7 @@ const Newline = require('./lib/components/newline'); | |
const Indent = require('./lib/components/indent'); | ||
const Group = require('./lib/components/group'); | ||
const Text = require('./lib/components/text'); | ||
const Bar = require('./lib/components/bar'); | ||
|
||
exports.StringComponent = StringComponent; | ||
exports.Component = Component; | ||
|
@@ -19,6 +20,7 @@ exports.Newline = Newline; | |
exports.Indent = Indent; | ||
exports.Group = Group; | ||
exports.Text = Text; | ||
exports.Bar = Bar; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Just There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fixed |
||
|
||
const noop = () => {}; | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
'use strict'; | ||
|
||
const blacklist = require('blacklist'); | ||
const Component = require('../component'); | ||
const h = require('../h'); | ||
const Text = require('./text'); | ||
|
||
const PROPS = ['percent', 'left', 'right', 'columns', 'char']; | ||
|
||
class Bar extends Component { | ||
getString() { | ||
const { | ||
percent = 1, | ||
left = 0, | ||
right = 0, | ||
char = '█' | ||
} = this.props; | ||
const screen = this.props.columns || process.stdout.columns || 80; | ||
const space = screen - right - left; | ||
let str = ''; | ||
const max = Math.min(Math.floor(space * percent), space); | ||
for (let i = 0; i < max; i++) { | ||
str += char; | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. char.repeat(max); There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fixed |
||
|
||
return str; | ||
} | ||
|
||
render() { | ||
const props = blacklist(this.props, PROPS); | ||
return h(Text, props, this.getString()); | ||
} | ||
} | ||
|
||
module.exports = Bar; | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
import test from 'ava'; | ||
|
||
const Bar = require('../lib/components/bar.js'); | ||
|
||
const run = (columns, left, right) => Bar.prototype.getString.call({ | ||
props: {columns, left, right, char: 'x'} | ||
}); | ||
|
||
test(`has correct length`, t => { | ||
const str = run(50, 0, 0); | ||
t.is(str.length, 50); | ||
|
||
const str2 = run(60, 10, 9); | ||
t.is(str2.length, 41); | ||
}); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Put the Babel config in package.json
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.