Skip to content

Commit

Permalink
initial release
Browse files Browse the repository at this point in the history
  • Loading branch information
Yury Dymov committed Sep 15, 2016
1 parent 74ad7a8 commit 67076f6
Show file tree
Hide file tree
Showing 18 changed files with 1,211 additions and 365 deletions.
263 changes: 8 additions & 255 deletions .eslintrc
@@ -1,257 +1,10 @@
{
"parser": "babel-eslint",

"plugins": [
"react"
],

"env": {
"browser": true,
"node": true,
"mocha": true,
"es6": true
},

"ecmaFeatures": {
"arrowFunctions": true,
"blockBindings": true,
"classes": true,
"defaultParams": true,
"destructuring": true,
"forOf": true,
"generators": false,
"modules": true,
"objectLiteralComputedProperties": true,
"objectLiteralDuplicateProperties": false,
"objectLiteralShorthandMethods": true,
"objectLiteralShorthandProperties": true,
"restParams": true,
"spread": true,
"superInFunctions": true,
"templateStrings": true,
"jsx": true
},

"rules":{
// Possible errors
"no-cond-assign": [2, "always"],
"no-constant-condition": 2,
"no-control-regex": 2,
"no-dupe-args": 2,
"no-dupe-keys": 2,
"no-duplicate-case": 2,
"no-empty-character-class": 2,
"no-empty": 2,
"no-ex-assign": 2,
"no-extra-boolean-cast": 0,
"no-extra-parens": [2, "functions"],
"no-extra-semi": 2,
"no-func-assign": 2,
"no-inner-declarations": 2,
"no-invalid-regexp": 2,
"no-irregular-whitespace": 2,
"no-negated-in-lhs": 2,
"no-obj-calls": 2,
"no-regex-spaces": 2,
"no-sparse-arrays": 2,
"no-unreachable": 2,
"use-isnan": 2,
"valid-typeof": 2,
"no-unexpected-multiline": 0,

// Best Practices
"block-scoped-var": 2,
"complexity": [2, 40],
"curly": [2, "multi-line"],
"default-case": 2,
"dot-notation": [2, { "allowKeywords": true }],
"eqeqeq": 2,
"guard-for-in": 2,
"no-alert": 1,
"no-caller": 2,
"no-case-declarations": 2,
"no-div-regex": 0,
"no-else-return": 2,
"no-eq-null": 2,
"no-eval": 2,
"no-extend-native": 2,
"no-extra-bind": 2,
"no-fallthrough": 2,
"no-floating-decimal": 2,
"no-implied-eval": 2,
"no-iterator": 2,
"no-labels": 2,
"no-lone-blocks": 2,
"no-loop-func": 2,
// "no-multi-spaces": [2, { exceptions: { "VariableDeclarator": true, "ImportDeclaration": true } }],
"no-multi-str": 2,
"no-native-reassign": 2,
"no-new": 2,
"no-new-func": 2,
"no-new-wrappers": 2,
"no-octal": 2,
"no-octal-escape": 2,
"no-param-reassign": [2, { "props": true }],
"no-proto": 2,
"no-redeclare": 2,
"no-script-url": 2,
"no-self-compare": 2,
"no-sequences": 2,
// "no-throw-literal": 2,
"no-unused-expressions": 2,
"no-useless-call": 2,
"no-with": 2,
"radix": 2,
"wrap-iife": [2, "outside"],
"yoda": 2,

// ES2015
"arrow-parens": 0,
"arrow-spacing": [2, { "before": true, "after": true }],
"constructor-super": 2,
"no-class-assign": 2,
"no-const-assign": 2,
"no-this-before-super": 0,
"no-var": 2,
"object-shorthand": [2, "always"],
"prefer-arrow-callback": 2,
"prefer-const": 2,
"prefer-spread": 2,
"prefer-template": 2,

// Strict Mode
"strict": [2, "never"],

// Variables
"no-catch-shadow": 2,
"no-delete-var": 2,
"no-label-var": 2,
"no-shadow-restricted-names": 2,
"no-shadow": 2,
"no-undef-init": 2,
"no-undef": 2,
"no-unused-vars": 2,

// Node.js
"callback-return": 2,
"no-mixed-requires": 2,
"no-path-concat": 2,
"no-sync": 2,
"handle-callback-err": 1,
"no-new-require": 2,

// Stylistic
"array-bracket-spacing": [2, "never", {
"singleValue": true,
"objectsInArrays": true,
"arraysInArrays": true
}],
"newline-after-var": [1, "always"],
"camelcase": [2, { "properties": "always" }],
"comma-spacing": [2, { "before": false, "after": true }],
"comma-style": [2, "last"],
"computed-property-spacing": [2, "never"],
"eol-last": 2,
"func-names": 1,
"func-style": [2, "declaration"],
"indent": [2, 2, { "SwitchCase": 1 }],
"jsx-quotes": [2, "prefer-single"],
// "key-spacing": [2, {
// "singleLine": {
// "beforeColon": false,
// "afterColon": true
// },
// "multiLine": {
// "beforeColon": true,
// "afterColon": true,
// "align": "colon"
// }
// }],
"linebreak-style": [2, "unix"],
"max-len": [2, 128, 4, {
"ignoreUrls": true,
"ignoreComments": false
}],
"max-nested-callbacks": [2, 4],
"new-parens": 2,
"no-array-constructor": 2,
"no-lonely-if": 2,
"no-mixed-spaces-and-tabs": 2,
"no-multiple-empty-lines": [2, { "max": 2, "maxEOF": 1 }],
"no-nested-ternary": 2,
"no-new-object": 2,
"no-spaced-func": 2,
"no-trailing-spaces": 2,
"no-unneeded-ternary": 2,
"object-curly-spacing": [2, "always"],
"one-var": [2, "never"],
"padded-blocks": [2, "never"],
"quotes": [1, "single", "avoid-escape"],
"semi-spacing": [2, { "before": false, "after": true }],
"semi": [2, "always"],
"keyword-spacing": 2,
"space-before-blocks": 2,
"space-before-function-paren": [2, { "anonymous": "always", "named": "never" }],
"space-in-parens": [2, "never"],
"space-infix-ops": 2,
"space-unary-ops": [2, { "words": true, "nonwords": false }],
"spaced-comment": [2, "always", {
"exceptions": ["-", "+"],
"markers": ["=", "!"]
}],

// React
"react/jsx-boolean-value": 2,
"react/jsx-closing-bracket-location": 2,
"react/jsx-curly-spacing": [2, "never"],
"react/jsx-handler-names": 2,
"react/jsx-indent-props": [2, 2],
"react/jsx-indent": [2, 2],
"react/jsx-key": 2,
"react/jsx-max-props-per-line": [2, {maximum: 3}],
"react/jsx-no-bind": [2, {
"ignoreRefs": true,
"allowBind": true,
"allowArrowFunctions": true
}],
"react/jsx-no-duplicate-props": 2,
"react/jsx-no-undef": 2,
"react/jsx-pascal-case": 2,
"react/jsx-uses-react": 2,
"react/jsx-uses-vars": 2,
// "react/no-danger": 2,
"react/no-deprecated": 2,
"react/no-did-mount-set-state": 0,
"react/no-did-update-set-state": 2,
"react/no-direct-mutation-state": 2,
"react/no-is-mounted": 2,
"react/no-multi-comp": 2,
"react/no-string-refs": 2,
"react/no-unknown-property": 2,
"react/prefer-es6-class": 2,
"react/prop-types": 2,
"react/react-in-jsx-scope": 2,
"react/self-closing-comp": 2,
"react/sort-comp": [2, {
"order": [
"lifecycle",
"/^handle.+$/",
"/^(get|set)(?!(InitialState$|DefaultProps$|ChildContext$)).+$/",
"everything-else",
"/^render.+$/",
"render"
]
}],
"react/wrap-multilines": 2,

// Legacy
"max-depth": [0, 4],
"max-params": [2, 4],
"no-bitwise": 2
},

"globals":{
"$": true,
"ga": true
}
"extends": "airbnb",
"parser": "babel-eslint",
"rules": {
"key-spacing": [0],
"no-empty": [0],
"no-multi-spaces": [0],
"react/jsx-equals-spacing": [0]
}
}
2 changes: 1 addition & 1 deletion .gitignore
Expand Up @@ -36,4 +36,4 @@ jspm_packages
# Optional REPL history
.node_repl_history
.idea
dist
/dist
8 changes: 8 additions & 0 deletions .npmignore
@@ -1,2 +1,10 @@
.idea
coverage
demo
docs
src
test
.babelrc
.eslintrc
.travis.yml
webpack.config.js
14 changes: 14 additions & 0 deletions .travis.yml
@@ -0,0 +1,14 @@
language: node_js
node_js:
- "6"
- "5"
- "4"
- "node"
env:
- CXX=g++-4.8
before_install:
- sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
- sudo apt-get -qq update
- sudo apt-get -qq install g++-4.8
install: "npm install && npm run build"
after_success: "npm install -g coveralls && npm run coverage && cat ./coverage/lcov.info | coveralls"
85 changes: 85 additions & 0 deletions README.md
@@ -0,0 +1,85 @@
# react-bootstrap-time-picker
Time Picker with bootstrap flavor

[![react-bootstrap-time-picker](https://github.com/yury-dymov/react-bootstrap-time-picker/raw/master/docs/rbtp.png)](https://github.com/yury-dymov/react-bootstrap-time-picker)

[![npm version](https://img.shields.io/npm/v/react-bootstrap-time-picker.svg?style=flat)](https://www.npmjs.com/package/react-bootstrap-time-picker)
[![Downloads](http://img.shields.io/npm/dm/react-bootstrap-time-picker.svg?style=flat-square)](https://npmjs.org/package/react-bootstrap-time-picker)
[![Build Status](https://img.shields.io/travis/yury-dymov/react-bootstrap-time-picker/master.svg?style=flat)](https://travis-ci.org/yury-dymov/react-bootstrap-time-picker)
[![Coverage Status](https://coveralls.io/repos/github/yury-dymov/react-bootstrap-time-picker/badge.svg?branch=master)](https://coveralls.io/github/yury-dymov/react-bootstrap-time-picker?branch=master)

# Demo
Demo and playground are available [here](https://yury-dymov.github.io/react-bootstrap-time-picker/)

# Usage Example
```
import TimePicker from 'react-bootstrap-time-picker';
<TimePicker start="10:00" end="21:00" step={30} />
```

# Configurable Props
*Note*: All props are optional.

### end: string, default "23:59"
Time Picker renders options with range between `start` and `end` time values with `step` (inclusive).

Should be provided in the following format: "HH?(:mm?(:ss?))".

#### Valid examples
"4", "04", "4:0", "04:00", "4:0:0", "04:00:00". All these are equal to "4 hours".

#### Invalid example
"11:00 PM". Should be provided in 24-hour format only

### format: number, default "23:59"
Time Format of rendered options. Supported values: `12` or `24`.

### initialValue: any, default: "00:00"
Initial selected option. Used if `value` prop is either `undefined` or `null`. Can be provided either in "HH?(:mm?(:ss?))" format or as int `(hours * 3600 + minutes * 60 + seconds)`. If `initialValue` is less than `start` property value, then `start` value is used instead.

#### Valid examples
"1:00", "01:00", "3600", 3600

#### Invalid examples
"11:00 PM"

### onChange: func, default: () => {}
Function, which is triggered after one of options is selected. Return selected time in int format: `(hours * 3600 + minutes * 60 + seconds)`.

#### Example
```
class Parent extends React.Component {
constructor() {
super();
this.handleTimeChange = this.handleTimeChange.bind(this);
this.state = { time: 0 };
}
handleTimeChange(time) {
console.log(time); // <- prints "3600" if "01:00" is picked
this.setState({ time });
}
render() {
return <TimePicker onChange={this.handleTimeChange} value={this.state.time};
}
}
```

### start: string, default: "00:00"
See `end` property description.

### step: number, default: 30
Step between time options in minutes. See `end` property description.

### value
Current value. See `initialValue` description.

# Validations
Library doesn't validate provided props much. If you are doing something strange like setting `start="10:00", end="05:00"`, then behavior is undefined, which means that it might render component differently in the future versions. Also underlying library [time-number](https://github.com/yury-dymov/time-number) throws exceptions if provided time is not in a proper format, i.e. values `12:00 PM` and `adl` are considered invalid.

# License
MIT (c) Yury Dymov
3 changes: 3 additions & 0 deletions demo/.babelrc
@@ -0,0 +1,3 @@
{
"presets": ["react", "es2015", "stage-0"]
}

0 comments on commit 67076f6

Please sign in to comment.