Commit 800be6cd by hfpp2012 yinsigan

用es6来重写spd

1 parent 8390dd24
......@@ -7,10 +7,16 @@
"start": "webpack-dev-server"
},
"dependencies": {
"halogen": "^0.2.0",
"html-webpack-plugin": "^2.28.0",
"jquery": "^3.2.1",
"path": "^0.12.7",
"react": "^15.5.4",
"react-addons-update": "^15.5.2",
"react-alert": "^2.0.1",
"react-bootstrap": "^0.31.0",
"react-dom": "^15.5.4",
"react-router-dom": "^4.1.1",
"webpack": "^2.5.1",
"webpack-dev-server": "^2.4.5"
},
......
import React from 'react'
import Move from '../libs/move'
import EventEmitter from '../libs/eventEmitter'
import { hashHistory } from 'react-router'
export default class Element extends React.Component {
static get getDefaultProps() {
return {
// allow the initial position to be passed in as a prop
initialPos: {x: 0, y: 0}
}
}
constructor(props){
super(props);
this.state = {
pos: this.props.initialPos,
dragging: false,
rel: null, // position relative to the cursor
zIndex: 2,
parent_id: null,
hasMoved: false,
edit: false,
name: this.props.name,
prev_name: this.props.name
};
}
componentDidUpdate(props, state) {
if (this.state.dragging && !state.dragging) {
document.addEventListener('mousemove', this.onMouseMove)
document.addEventListener('mouseup', this.onMouseUp)
} else if (!this.state.dragging && state.dragging) {
document.removeEventListener('mousemove', this.onMouseMove)
document.removeEventListener('mouseup', this.onMouseUp)
}
}
onMouseDown(event) {
if (event.button !== 0) return
if (!this.props.isDropZoneChild) {
this.handleCloneElement()
}
this.setState({
dragging: true,
rel: {
x: event.pageX - this.element().offsetLeft,
y: event.pageY - this.element().offsetTop
},
zIndex: this.state.zIndex++,
hasMoved: false
})
event.stopPropagation()
event.preventDefault()
}
onMouseMove(event) {
if (!this.state.dragging) return
let pageWidth
if (this.props.isDropZoneChild) {
pageWidth = this.dropzone().clientWidth
} else {
pageWidth = document.documentElement.clientWidth + 20
}
//var pageHeight = document.documentElement.clientHeight
const elementWidth = this.element().offsetWidth
const elementHeight = this.element().offsetHeight
const maxX = pageWidth - elementWidth
const maxY = this.dropzone().clientHeight - elementHeight
let moveX = event.pageX - this.state.rel.x
let moveY = event.pageY - this.state.rel.y
moveX = Math.min( maxX, Math.max(0, moveX) )
moveY = Math.min( maxY, Math.max(0, moveY) )
this.setState({
pos: {
x: moveX,
y: moveY
},
hasMoved: true
})
event.stopPropagation()
event.preventDefault()
}
onMouseUp(event) {
this.setState({ dragging: false })
if (this.props.isDropZoneChild) {
const element = {
id: this.props.id,
pos_x: this.state.pos.x,
pos_y: this.state.pos.y,
}
if (this.state.hasMoved) {
EventEmitter.dispatch('element:update', element)
}
} else if (this.jl(this.element(), this.dropzone())) {
this.handleMoveDropZone()
} else {
Move( this.element() , { left: this.props.initialPos.x , top: this.props.initialPos.y } )
this.handleDeleteLastElement()
}
event.stopPropagation()
event.preventDefault()
}
element() {
return this.refs.meta_element
}
dropzone() {
return document.getElementById('dropzone')
}
sidebar() {
return document.getElementById('sidebar')
}
handleCloneElement() {
if (this.props.handleCloneElement) {
const element = {
id: this.props.id + 3,
name: this.props.name,
initialPos: {
x: this.props.initialPos.x,
y: this.props.initialPos.y
},
target_type: this.props.target_type
}
this.props.handleCloneElement(element)
}
}
handleDeleteLastElement() {
if (this.props.handleDeleteLastElement) {
this.props.handleDeleteLastElement()
}
}
handleMoveDropZone() {
const element = {
name: this.props.name,
target_type: this.props.target_type,
initialPos: {
x: this.state.pos.x - this.sidebar().clientWidth,
y: this.state.pos.y - this.sidebar().clientHeight + 55
}
}
EventEmitter.dispatch('moveDropZone', element)
if (this.props.handleDeleteElement) {
this.props.handleDeleteElement(this.props.meta_element)
}
}
// 碰撞
// pz: function(obj1, obj2) {
// var L1 = obj1.offsetLeft
// var R1 = obj1.offsetLeft + obj1.offsetWidth
// var T1 = obj1.offsetTop
// var B1 = obj1.offsetTop + obj1.offsetHeight
//
// var L2 = obj2.offsetLeft
// var R2 = obj2.offsetLeft + obj2.offsetWidth
// var T2 = obj2.offsetTop
// var B2 = obj2.offsetTop + obj2.offsetHeight
//
// if( R1<L2 || L1>R2 || B1<T2 || T1>B2 ){
// return false
// }
// else{
// return true
// }
// },
jl(obj1, obj2){
let result = obj1.offsetLeft - obj2.offsetLeft - this.props.initialPos.x + 65
return result > 0 ? true : false
}
handleClick() {
if (this.props.isDropZoneChild) {
this.setState({ edit: true })
}
}
handleChange(e) {
this.setState({ name: e.target.value })
}
handleBlur() {
this.handleUpdateName()
}
handleKeyPress(e) {
if (e.key === 'Enter') {
this.handleUpdateName()
}
}
handleUpdateName() {
this.setState({ edit: false })
const element = {
id: this.props.id,
name: this.state.name
}
if (this.state.name != this.state.prev_name) {
if (this.state.name.trim() == "") {
this.setState({ name: this.state.prev_name })
} else {
EventEmitter.dispatch('element:update', element)
this.setState({ prev_name: this.state.name })
}
}
}
handleDoubleClick() {
const childrenObjectType = this.props.childrenObjectType
const url = `/regional_design/${this.props.id}?object=${childrenObjectType}`
if (childrenObjectType != 'drug_brandreth_grid') {
hashHistory.push(url)
}
}
divBlock() {
return (
<div style={{ position: 'absolute', left: this.state.pos.x + 'px', top: this.state.pos.y + 'px', zIndex: this.state.zIndex }} ref='meta_element' className="meta-element text-center" onMouseDown={ this.onMouseDown } onDoubleClick={ this.handleDoubleClick }>
<span onClick={ this.handleClick }>{this.state.name}</span>
</div>
)
}
inputText() {
return (
<div style={{ position: 'absolute', left: this.state.pos.x + 'px', top: this.state.pos.y + 'px', zIndex: this.state.zIndex }} className="input-meta-element text-center">
<input autoFocus type="text" id="formHorizontalName" className="form-control" ref='name' value={ this.state.name } onChange={ this.handleChange } onBlur={ this.handleBlur } onKeyPress={ this.handleKeyPress } />
</div>
)
}
render() {
if (this.state.edit) {
return this.inputText()
} else {
return this.divBlock()
}
}
}
import React from 'react'
import Element from './Element'
import ReactAddonsUpdate from 'react-addons-update'
export default class ElementGroup extends React.Component {
constructor(props){
super(props);
this.state = {
elements: [
{ id: 1, name: "药库", initialPos: {x: 80, y: 70}, target_type: 'RegionalDesign::Repo' },
{ id: 2, name: "药架", initialPos: {x: 80, y: 70 + 60}, target_type: 'RegionalDesign::DrugRepo' },
{ id: 3, name: "药架格", initialPos: {x: 80, y: 70 + 60 * 2}, target_type: 'RegionalDesign::DrugBrandreth' }
]
};
}
cloneElement(element) {
const elements = ReactAddonsUpdate(this.state.elements, { $push: [element] })
this.setState({elements: elements})
}
deleteElement(element) {
const index = this.state.elements.indexOf(element)
const elements = ReactAddonsUpdate(this.state.elements, { $splice: [[index, 1]] })
this.replaceState({elements: elements})
}
// 返回element的index为-1, 删除最后一个元素
deleteLastElement() {
const elements = ReactAddonsUpdate(this.state.elements, { $splice: [[-1, 1]] })
this.replaceState({elements: elements})
}
sidebar() {
return document.getElementById('sidebar')
}
render() {
return (
<div>
{
this.state.elements.map(function(element) {
return (
<Element meta_element={ element } key={ "key_" + element.id } id={ element.id } name={ element.name } initialPos={ element.initialPos } target_type={ element.target_type } handleCloneElement={ this.cloneElement } handleDeleteElement={ this.deleteElement } handleDeleteLastElement={ this.deleteLastElement } />
)
}.bind(this))
}
</div>
)
}
}
import React from 'react'
import ModalRepoForm from './ModalRepoForm'
import ReactAddonsUpdate from 'react-addons-update'
import Loader from 'halogen/PulseLoader'
import { Link } from 'react-router'
export default class Header extends React.Component {
constructor(props){
super(props);
this.state = {
data: null, loading: true, error: null
};
}
componentDidMount() {
this.props.promise.then(
value => this.setState({loading: false, data: value}),
error => this.setState({loading: false, error: error}))
}
addRepo(repo) {
const data = ReactAddonsUpdate(this.state.data, { $push: [repo] })
this.setState({ data: data })
}
render() {
return (
<div className="text-left top-header">
<ModalRepoForm handleNewRepo={ this.addRepo } />
<div className='col-md-10'>
{function(){
if (this.state.loading) {
return (
<Loader color="#286090" size="12px" margin="4px"/>
)
}
else if (this.state.error !== null) {
return <span>Error: {this.state.error.message}</span>
}
else {
const data = this.state.data.map(function(repo) {
const url = `/regional_design/${repo.id}?object=repo`
return (
<Link key={ repo.id } activeClassName='btn-primary' className='btn btn-default mr15' to={ url }>{ repo.name }</Link>
)
})
return data
}
}.call(this)}
</div>
<div className="clearfix"></div>
</div>
)
}
}
import React from 'react'
import { Modal, Button } from 'react-bootstrap'
import { Form, FormGroup, Col, FormControl, ControlLabel } from 'react-bootstrap'
import EventEmitter from '../libs/eventEmitter'
import $ from 'jquery'
export default class ModalRepoForm extends React.Component {
constructor(props){
super(props);
this.state = {
showModal: false, name: ''
};
}
close() {
this.setState({ showModal: false })
}
open() {
this.setState({ showModal: true })
}
handleChange(e) {
return this.setState({ name: e.target.value })
}
save(e) {
if (this.refs.name.value.trim().length === 0) {
this.setState({ showNameError: true })
return false
} else {
this.setState({ showNameError: false })
e.preventDefault()
$.post('/regional_design/repos.json', { repo: this.state }, function(data) {
this.props.handleNewRepo(data)
this.setState(this.getInitialState())
EventEmitter.dispatch('alert', '操作成功')
}.bind(this), 'JSON')
}
}
render() {
return (
<div className='col-md-2'>
<Button
bsStyle="primary"
bsSize="small"
onClick={this.open}
>
新建仓库
</Button>
<Modal backdrop='static' show={this.state.showModal} onHide={this.close}>
<Modal.Header closeButton>
<Modal.Title>新建仓库</Modal.Title>
</Modal.Header>
<Modal.Body className='clearfix'>
<form className='form-horizontal'>
<label htmlFor="formHorizontalName" className="col-sm-2 control-label">仓库名</label>
<div className="col-sm-5">
<input autoFocus type="text" id="formHorizontalName" className="form-control" ref='name' value={ this.state.name } onChange={ this.handleChange } />
{function(){
if (this.state.showNameError) {
return <p className="text-danger">仓库名不能为空</p>
}
}.call(this)}
</div>
</form>
</Modal.Body>
<Modal.Footer>
<Button bsStyle="primary" onClick={this.save}>保存</Button>
<Button onClick={this.close}>关闭</Button>
</Modal.Footer>
</Modal>
</div>
)
}
}
import React from 'react'
import Loader from 'halogen/PulseLoader'
import Element from './Element'
import ReactAddonsUpdate from 'react-addons-update'
import EventEmitter from '../libs/eventEmitter'
import $ from 'jquery'
export default class RegionalDesign extends React.Component {
constructor(props){
super(props);
this.state = {
data: null, loading: true, error: null, object_name: '', object_type: '', children_object_type: ''
};
}
getConfig(props, key) {
const config = {
repo: {
object_url: '/regional_design/repos',
children_object_url: '/regional_design/drug_repos',
children_param_name: 'drug_repo'
},
drug_repo: {
object_url: '/regional_design/drug_repos',
children_object_url: '/regional_design/drug_brandrethes',
children_param_name: 'drug_brandreth'
},
drug_brandreth: {
object_url: '/regional_design/drug_brandrethes',
children_object_url: '/regional_design/drug_brandreth_grids',
children_param_name: 'drug_brandreth_grid'
}
}
return config[props.location.query.object][key]
}
componentDidMount() {
const url = this.getConfig(this.props, 'object_url') + '/' + this.props.params.id + '.json'
this.getJSON(url)
EventEmitter.subscribe('moveDropZone', function(element){
if (element.target_type == this.state.object_type) {
this.addElement(element)
} else {
EventEmitter.dispatch('alert', '不能移动该元件')
}
}.bind(this))
EventEmitter.subscribe('element:update', function(element){
this.updateElement(element)
}.bind(this))
}
addElement(element) {
const new_element = {
name: element.name,
pos_x: element.initialPos.x,
pos_y: element.initialPos.y,
parent_id: this.props.params.id
}
const url = this.getConfig(this.props, 'children_object_url') + '.json'
let data = {}
data[this.getConfig(this.props, 'children_param_name')] = new_element
$.post(url, data, function(data) {
EventEmitter.dispatch('alert', '添加元件成功')
element.id = data.id
element.children_object_type = this.state.children_object_type
const elements = ReactAddonsUpdate(this.state.data, { $push: [element] })
this.setState({data: elements})
}.bind(this), 'JSON')
}
updateElement(element) {
let data = {}
data[this.getConfig(this.props, 'children_param_name')] = element
$.ajax({
method: 'PUT',
url: this.getConfig(this.props, 'children_object_url') + '/' + element.id,
dataType: 'JSON',
data: data,
success: function(data) {
}.bind(this)
})
}
componentWillUnmount() {
EventEmitter.unSubscribe('moveDropZone')
EventEmitter.unSubscribe('element:update')
}
componentWillReceiveProps(nextProps) {
this.setState(this.getInitialState)
const url = this.getConfig(nextProps, 'object_url') + '/' + nextProps.params.id + '.json'
this.getJSON(url)
}
getJSON(url) {
$.getJSON(url).then(
value => this.setState({loading: false, data: value.children, object_name: value.name, object_type: value.type, children_object_type: value.children_object_type}),
error => this.setState({loading: false, error: error}))
}
render() {
if (this.state.loading) {
return (
<Loader color="#286090" size="12px" margin="4px"/>
)
}
else if (this.state.error !== null) {
return <span>Error: {this.state.error}</span>
}
else {
const data = this.state.data.map(function(element) {
return (
<Element childrenObjectType={ this.state.children_object_type } isDropZoneChild={ true } key={ element.id } id={ element.id } name={ element.name } initialPos={ element.initialPos } />
)
}.bind(this))
return (
<div>
<h1 className='text-center'>{ this.state.object_name }</h1>
<div>{ data }</div>
</div>
)
}
}
}
import React from 'react'
import ElementGroup from '../components/ElementGroup'
import Header from '../components/Header'
import AlertContainer from 'react-alert'
import EventEmitter from '../libs/eventEmitter'
import $ from 'jquery'
export default class Spd extends React.Component {
componentDidMount() {
EventEmitter.subscribe('alert', function(info){
this.showAlert(info)
}.bind(this))
}
componentWillUnmount() {
EventEmitter.unSubscribe('alert')
}
componentWillMount() {
this.alertOptions = {
offset: 14,
position: 'top right',
theme: 'dark',
time: 5000,
transition: 'scale'
}
}
showAlert(info) {
this.msg.show(info, {
time: 2000,
type: 'success',
icon: <img src="/images/success.png" />
})
}
render() {
return (
<div id="app">
<AlertContainer ref={a => this.msg = a} {...this.alertOptions} />
<div className="row">
<Header promise={$.getJSON('/regional_design/repos.json')} />
</div>
<div className="row">
<div className="col-md-2 sidebar" id='sidebar'>
<h3 className='sidebar-header'>元件</h3>
<ElementGroup />
</div>
<div id="dropzone" className="col-md-10 dropzone">
{this.props.children}
</div>
</div>
</div>
)
}
}
No preview for this file type
import React from 'react'
import ReactDOM from 'react-dom'
import Spd from './containers/Spd'
import {
BrowserRouter as Router,
Route,
Link
} from 'react-router-dom'
import RegionalDesign from './components/RegionalDesign'
ReactDOM.render(
<Router handler={Spd} history={Router}>
<Route path="/" component={Spd}>
<Route path="/regional_design/:id" component={RegionalDesign} />
</Route>
</Router>,
document.getElementById('root')
);
export default {
_events: {},
dispatch: function (event, data) {
if (!this._events[event]) return // no one is listening to this event
for (let i = 0; i < this._events[event].length; i++)
this._events[event][i](data)
},
subscribe: function (event, callback) {
if (!this._events[event]) this._events[event] = [] // new event
this._events[event].push(callback)
},
unSubscribe: function(event){
if(this._events && this._events[event]) {
delete this._events[event]
}
}
}
function startMove(obj, json, endFn) {
clearInterval(obj.timer)
obj.timer = setInterval(function() {
let bBtn = true
for (let attr in json) {
let iCur = 0
if (attr == 'opacity') {
if (Math.round(parseFloat(getStyle(obj, attr)) * 100) == 0) {
iCur = Math.round(parseFloat(getStyle(obj, attr)) * 100)
} else {
iCur = Math.round(parseFloat(getStyle(obj, attr)) * 100) || 100
}
} else {
iCur = parseInt(getStyle(obj,attr)) || 0
}
let iSpeed = (json[attr] - iCur)/8
iSpeed = iSpeed >0 ? Math.ceil(iSpeed) : Math.floor(iSpeed)
if (iCur != json[attr]) {
bBtn = false
}
if (attr == 'opacity') {
obj.style.filter = 'alpha(opacity=' + (iCur + iSpeed) + ')'
obj.style.opacity = (iCur + iSpeed)/100
} else {
obj.style[attr] = iCur + iSpeed + 'px'
}
}
if (bBtn) {
clearInterval(obj.timer)
if (endFn) {
endFn.call(obj)
}
}
}, 30)
}
function getStyle(obj, attr) {
if (obj.currentStyle) {
return obj.currentStyle[attr]
} else {
return getComputedStyle(obj,false)[attr]
}
}
export default startMove
......@@ -27,14 +27,19 @@ const extractSass = ExtractTextPlugin.extract({
const OpenBrowserPlugin = require('open-browser-webpack-plugin');
module.exports = {
entry: './client/index.js',
entry: './src/index.js',
output: {
path: path.resolve('dist'),
filename: 'index_bundle.js'
},
devServer: {
inline: true,
port: 3000
port: 3000,
proxy: {
"/regional_design/repos": {
target: "http://localhost:3001",
}
}
},
module: {
loaders: [
......
This diff could not be displayed because it is too large.
......@@ -617,7 +617,7 @@ babel-register@^6.24.1:
mkdirp "^0.5.1"
source-map-support "^0.4.2"
babel-runtime@^6.18.0, babel-runtime@^6.22.0:
babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0:
version "6.23.0"
resolved "http://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
dependencies:
......@@ -726,6 +726,10 @@ braces@^1.8.2:
preserve "^0.2.0"
repeat-element "^1.1.2"
brcast@^2.0.0:
version "2.0.0"
resolved "http://registry.npm.taobao.org/brcast/download/brcast-2.0.0.tgz#9e627ab82209895664c1d6c1f45cd8c43422e3f6"
brorand@^1.0.1:
version "1.1.0"
resolved "http://registry.npm.taobao.org/brorand/download/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
......@@ -866,6 +870,10 @@ center-align@^0.1.1:
align-text "^0.1.3"
lazy-cache "^1.0.3"
chain-function@^1.0.0:
version "1.0.0"
resolved "http://registry.npm.taobao.org/chain-function/download/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc"
chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
version "1.1.3"
resolved "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
......@@ -903,6 +911,10 @@ clap@^1.0.9:
dependencies:
chalk "^1.1.3"
classnames@^2.2.5:
version "2.2.5"
resolved "http://registry.npm.taobao.org/classnames/download/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d"
clean-css@4.1.x:
version "4.1.3"
resolved "http://registry.npm.taobao.org/clean-css/download/clean-css-4.1.3.tgz#07cfe8980edb20d455ddc23aadcf1e04c6e509ce"
......@@ -1313,6 +1325,10 @@ dom-converter@~0.1:
dependencies:
utila "~0.3"
dom-helpers@^3.2.0:
version "3.2.1"
resolved "http://registry.npm.taobao.org/dom-helpers/download/dom-helpers-3.2.1.tgz#3203e07fed217bd1f424b019735582fc37b2825a"
dom-serializer@0:
version "0.1.0"
resolved "http://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
......@@ -1338,6 +1354,10 @@ domhandler@2.1:
dependencies:
domelementtype "1"
domkit@0.0.1:
version "0.0.1"
resolved "http://registry.npm.taobao.org/domkit/download/domkit-0.0.1.tgz#88399d586794efc1154fec6c22cfe50f19bd4dbb"
domutils@1.1:
version "1.1.6"
resolved "http://registry.npm.taobao.org/domutils/download/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485"
......@@ -1524,6 +1544,10 @@ extsprintf@1.0.2:
version "1.0.2"
resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
fast-memoize@^2.2.7:
version "2.2.7"
resolved "http://registry.npm.taobao.org/fast-memoize/download/fast-memoize-2.2.7.tgz#f145c5c22039cedf0a1d4ff6ca592ad0268470ca"
fastparse@^1.1.1:
version "1.1.1"
resolved "http://registry.npm.taobao.org/fastparse/download/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
......@@ -1540,7 +1564,7 @@ faye-websocket@~0.11.0:
dependencies:
websocket-driver ">=0.5.1"
fbjs@^0.8.9:
fbjs@^0.8.8, fbjs@^0.8.9:
version "0.8.12"
resolved "http://registry.npm.taobao.org/fbjs/download/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04"
dependencies:
......@@ -1696,6 +1720,25 @@ getpass@^0.1.1:
dependencies:
assert-plus "^1.0.0"
glamor@^2.20.24:
version "2.20.25"
resolved "http://registry.npm.taobao.org/glamor/download/glamor-2.20.25.tgz#71b84b82b67a9327771ac59de53ee915d148a4a3"
dependencies:
babel-runtime "^6.18.0"
fbjs "^0.8.8"
object-assign "^4.1.0"
prop-types "^15.5.8"
glamorous@^3.13.1:
version "3.15.0"
resolved "http://registry.npm.taobao.org/glamorous/download/glamorous-3.15.0.tgz#c95e2d0cbf9e748625afe3f41114428c62cc8ec4"
dependencies:
brcast "^2.0.0"
fast-memoize "^2.2.7"
html-tag-names "^1.1.1"
react-html-attributes "^1.3.0"
svg-tag-names "^1.1.0"
glob-base@^0.3.0:
version "0.3.0"
resolved "http://registry.npm.taobao.org/glob-base/download/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
......@@ -1740,6 +1783,12 @@ graceful-fs@^4.1.2:
version "1.0.1"
resolved "http://registry.npm.taobao.org/graceful-readlink/download/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
halogen@^0.2.0:
version "0.2.0"
resolved "http://registry.npm.taobao.org/halogen/download/halogen-0.2.0.tgz#1c65a99a9352e6bf02f41beb7081852fce7e7473"
dependencies:
domkit "0.0.1"
handle-thing@^1.2.4:
version "1.2.5"
resolved "http://registry.npm.taobao.org/handle-thing/download/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4"
......@@ -1800,6 +1849,16 @@ he@1.1.x:
version "1.1.1"
resolved "http://registry.npm.taobao.org/he/download/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
history@^4.5.1, history@^4.6.0:
version "4.6.1"
resolved "http://registry.npm.taobao.org/history/download/history-4.6.1.tgz#911cf8eb65728555a94f2b12780a0c531a14d2fd"
dependencies:
invariant "^2.2.1"
loose-envify "^1.2.0"
resolve-pathname "^2.0.0"
value-equal "^0.2.0"
warning "^3.0.0"
hmac-drbg@^1.0.0:
version "1.0.1"
resolved "http://registry.npm.taobao.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
......@@ -1812,6 +1871,10 @@ hoek@2.x.x:
version "2.16.3"
resolved "http://registry.npm.taobao.org/hoek/download/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
hoist-non-react-statics@^1.2.0:
version "1.2.0"
resolved "http://registry.npm.taobao.org/hoist-non-react-statics/download/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb"
home-or-tmp@^2.0.0:
version "2.0.0"
resolved "http://registry.npm.taobao.org/home-or-tmp/download/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
......@@ -1836,6 +1899,10 @@ html-comment-regex@^1.1.0:
version "1.1.1"
resolved "http://registry.npm.taobao.org/html-comment-regex/download/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
html-element-attributes@^1.0.0:
version "1.2.0"
resolved "http://registry.npm.taobao.org/html-element-attributes/download/html-element-attributes-1.2.0.tgz#8b1c7aaf94353fd9b455c27ec7ebaf1583e29fd0"
html-entities@^1.2.0:
version "1.2.1"
resolved "http://registry.npm.taobao.org/html-entities/download/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
......@@ -1853,6 +1920,10 @@ html-minifier@^3.2.3:
relateurl "0.2.x"
uglify-js "3.0.x"
html-tag-names@^1.1.1:
version "1.1.1"
resolved "http://registry.npm.taobao.org/html-tag-names/download/html-tag-names-1.1.1.tgz#f8a076113f16e393518937f6b3b5d22296755d4a"
html-webpack-plugin@^2.28.0:
version "2.28.0"
resolved "http://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-2.28.0.tgz#2e7863b57e5fd48fe263303e2ffc934c3064d009"
......@@ -1975,7 +2046,7 @@ interpret@^1.0.0:
version "1.0.3"
resolved "http://registry.npm.taobao.org/interpret/download/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90"
invariant@^2.2.0:
invariant@^2.1.0, invariant@^2.2.0, invariant@^2.2.1, invariant@^2.2.2:
version "2.2.2"
resolved "http://registry.npm.taobao.org/invariant/download/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
dependencies:
......@@ -2140,6 +2211,10 @@ jodid25519@^1.0.0:
dependencies:
jsbn "~0.1.0"
jquery@^3.2.1:
version "3.2.1"
resolved "http://registry.npm.taobao.org/jquery/download/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787"
js-base64@^2.1.8, js-base64@^2.1.9:
version "2.1.9"
resolved "http://registry.npm.taobao.org/js-base64/download/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce"
......@@ -2206,6 +2281,10 @@ jsprim@^1.2.2:
json-schema "0.2.3"
verror "1.3.6"
keycode@^2.1.2:
version "2.1.9"
resolved "http://registry.npm.taobao.org/keycode/download/keycode-2.1.9.tgz#964a23c54e4889405b4861a5c9f0480d45141dfa"
kind-of@^2.0.1:
version "2.0.1"
resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5"
......@@ -2303,7 +2382,7 @@ longest@^1.0.1:
version "1.0.1"
resolved "http://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1:
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1:
version "1.3.1"
resolved "http://registry.npm.taobao.org/loose-envify/download/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
dependencies:
......@@ -2777,6 +2856,12 @@ path-to-regexp@0.1.7:
version "0.1.7"
resolved "http://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
path-to-regexp@^1.5.3:
version "1.7.0"
resolved "http://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d"
dependencies:
isarray "0.0.1"
path-type@^1.0.0:
version "1.1.0"
resolved "http://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
......@@ -3105,7 +3190,7 @@ promise@^7.1.1:
dependencies:
asap "~2.0.3"
prop-types@^15.5.7, prop-types@~15.5.7:
prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@~15.5.7:
version "15.5.10"
resolved "http://registry.npm.taobao.org/prop-types/download/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154"
dependencies:
......@@ -3200,6 +3285,37 @@ rc@^1.1.7:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
react-addons-update@^15.5.2:
version "15.5.2"
resolved "http://registry.npm.taobao.org/react-addons-update/download/react-addons-update-15.5.2.tgz#0ada50494387b17238999ee9662f9f3fc38f935d"
dependencies:
fbjs "^0.8.9"
object-assign "^4.1.0"
react-alert@^2.0.1:
version "2.0.1"
resolved "http://registry.npm.taobao.org/react-alert/download/react-alert-2.0.1.tgz#1678f693b32d0fd3618bfa682b3afe4ae4624e87"
dependencies:
glamor "^2.20.24"
glamorous "^3.13.1"
react-transition-group "^1.1.2"
shortid "^2.2.8"
react-bootstrap@^0.31.0:
version "0.31.0"
resolved "http://registry.npm.taobao.org/react-bootstrap/download/react-bootstrap-0.31.0.tgz#bbca804c0404d9c640102b2b656ae4cd5bea35c8"
dependencies:
babel-runtime "^6.11.6"
classnames "^2.2.5"
dom-helpers "^3.2.0"
invariant "^2.2.1"
keycode "^2.1.2"
prop-types "^15.5.6"
react-overlays "^0.7.0"
react-prop-types "^0.4.0"
uncontrollable "^4.1.0"
warning "^3.0.0"
react-dom@^15.5.4:
version "15.5.4"
resolved "http://registry.npm.taobao.org/react-dom/download/react-dom-15.5.4.tgz#ba0c28786fd52ed7e4f2135fe0288d462aef93da"
......@@ -3209,6 +3325,58 @@ react-dom@^15.5.4:
object-assign "^4.1.0"
prop-types "~15.5.7"
react-html-attributes@^1.3.0:
version "1.3.0"
resolved "http://registry.npm.taobao.org/react-html-attributes/download/react-html-attributes-1.3.0.tgz#c97896e9cac47ad9c4e6618b835029a826f5d28c"
dependencies:
html-element-attributes "^1.0.0"
react-overlays@^0.7.0:
version "0.7.0"
resolved "http://registry.npm.taobao.org/react-overlays/download/react-overlays-0.7.0.tgz#531898ff566c7e5c7226ead2863b8cf9fbb5a981"
dependencies:
classnames "^2.2.5"
dom-helpers "^3.2.0"
prop-types "^15.5.8"
react-prop-types "^0.4.0"
warning "^3.0.0"
react-prop-types@^0.4.0:
version "0.4.0"
resolved "http://registry.npm.taobao.org/react-prop-types/download/react-prop-types-0.4.0.tgz#f99b0bfb4006929c9af2051e7c1414a5c75b93d0"
dependencies:
warning "^3.0.0"
react-router-dom@^4.1.1:
version "4.1.1"
resolved "http://registry.npm.taobao.org/react-router-dom/download/react-router-dom-4.1.1.tgz#3021ade1f2c160af97cf94e25594c5f294583025"
dependencies:
history "^4.5.1"
loose-envify "^1.3.1"
prop-types "^15.5.4"
react-router "^4.1.1"
react-router@^4.1.1:
version "4.1.1"
resolved "http://registry.npm.taobao.org/react-router/download/react-router-4.1.1.tgz#d448f3b7c1b429a6fbb03395099949c606b1fe95"
dependencies:
history "^4.6.0"
hoist-non-react-statics "^1.2.0"
invariant "^2.2.2"
loose-envify "^1.3.1"
path-to-regexp "^1.5.3"
prop-types "^15.5.4"
warning "^3.0.0"
react-transition-group@^1.1.2:
version "1.1.3"
resolved "http://registry.npm.taobao.org/react-transition-group/download/react-transition-group-1.1.3.tgz#5e02cf6e44a863314ff3c68a0c826c2d9d70b221"
dependencies:
chain-function "^1.0.0"
dom-helpers "^3.2.0"
prop-types "^15.5.6"
warning "^3.0.0"
react@^15.5.4:
version "15.5.4"
resolved "http://registry.npm.taobao.org/react/download/react-15.5.4.tgz#fa83eb01506ab237cdc1c8c3b1cea8de012bf047"
......@@ -3404,6 +3572,10 @@ requires-port@1.0.x, requires-port@1.x.x:
version "1.0.0"
resolved "http://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
resolve-pathname@^2.0.0:
version "2.1.0"
resolved "http://registry.npm.taobao.org/resolve-pathname/download/resolve-pathname-2.1.0.tgz#e8358801b86b83b17560d4e3c382d7aef2100944"
right-align@^0.1.1:
version "0.1.3"
resolved "http://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
......@@ -3539,6 +3711,10 @@ shallow-clone@^0.1.2:
lazy-cache "^0.2.3"
mixin-object "^2.0.1"
shortid@^2.2.8:
version "2.2.8"
resolved "http://registry.npm.taobao.org/shortid/download/shortid-2.2.8.tgz#033b117d6a2e975804f6f0969dbe7d3d0b355131"
signal-exit@^3.0.0:
version "3.0.2"
resolved "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
......@@ -3745,6 +3921,10 @@ supports-color@^3.1.0, supports-color@^3.1.1, supports-color@^3.2.3:
dependencies:
has-flag "^1.0.0"
svg-tag-names@^1.1.0:
version "1.1.0"
resolved "http://registry.npm.taobao.org/svg-tag-names/download/svg-tag-names-1.1.0.tgz#24c04db37f2ee2ee28bc619f4e8a25ee21fc0203"
svgo@^0.7.0:
version "0.7.2"
resolved "http://registry.npm.taobao.org/svgo/download/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
......@@ -3863,6 +4043,12 @@ uid-number@^0.0.6:
version "0.0.6"
resolved "http://registry.npm.taobao.org/uid-number/download/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
uncontrollable@^4.1.0:
version "4.1.0"
resolved "http://registry.npm.taobao.org/uncontrollable/download/uncontrollable-4.1.0.tgz#e0358291252e1865222d90939b19f2f49f81c1a9"
dependencies:
invariant "^2.1.0"
uniq@^1.0.1:
version "1.0.1"
resolved "http://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
......@@ -3943,6 +4129,10 @@ validate-npm-package-license@^3.0.1:
spdx-correct "~1.0.0"
spdx-expression-parse "~1.0.0"
value-equal@^0.2.0:
version "0.2.1"
resolved "http://registry.npm.taobao.org/value-equal/download/value-equal-0.2.1.tgz#c220a304361fce6994dbbedaa3c7e1a1b895871d"
vary@~1.1.0, vary@~1.1.1:
version "1.1.1"
resolved "http://registry.npm.taobao.org/vary/download/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37"
......@@ -3963,6 +4153,12 @@ vm-browserify@0.0.4:
dependencies:
indexof "0.0.1"
warning@^3.0.0:
version "3.0.0"
resolved "http://registry.npm.taobao.org/warning/download/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c"
dependencies:
loose-envify "^1.0.0"
watchpack@^1.3.1:
version "1.3.1"
resolved "http://registry.npm.taobao.org/watchpack/download/watchpack-1.3.1.tgz#7d8693907b28ce6013e7f3610aa2a1acf07dad87"
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!