Skip to content

Commit 867ec25

Browse files
committed
add user management for planet setting modal
1 parent 2e4aaf7 commit 867ec25

4 files changed

Lines changed: 87 additions & 4 deletions

File tree

browser/main/Actions/PlanetActions.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ module.exports = Reflux.createActions([
66

77
'changeName',
88
'addUser',
9+
'removeUser',
910

1011
'createSnippet',
1112
'updateSnippet',

browser/main/Components/PlanetSettingModal.jsx

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,33 @@
11
var React = require('react/addons')
2+
var request = require('superagent')
23
var Select = require('react-select')
34

45
var Catalyst = require('../Mixins/Catalyst')
56

67
var PlanetActions = require('../Actions/PlanetActions')
78

9+
var getOptions = function (input, callback) {
10+
request
11+
.get('http://localhost:8000/users/search')
12+
.query({name: input})
13+
.send()
14+
.end(function (err, res) {
15+
if (err) {
16+
callback(err)
17+
return
18+
}
19+
callback(null, {
20+
options: res.body.map(function (user) {
21+
return {
22+
label: user.name,
23+
value: user.name
24+
}
25+
}),
26+
complete: false
27+
})
28+
})
29+
}
30+
831
module.exports = React.createClass({
932
mixins: [Catalyst.LinkedStateMixin],
1033
propTypes: {
@@ -15,7 +38,8 @@ module.exports = React.createClass({
1538
return {
1639
currentTab: 'planetProfile',
1740
planetName: this.props.currentPlanet.name,
18-
isDeletePlanetChecked: false
41+
isDeletePlanetChecked: false,
42+
userName: ''
1943
}
2044
},
2145
activePlanetProfile: function () {
@@ -29,6 +53,17 @@ module.exports = React.createClass({
2953
var currentPlanet = this.props.currentPlanet
3054
PlanetActions.changeName(currentPlanet.userName, currentPlanet.name, this.state.planetName)
3155
},
56+
handleChange: function (value) {
57+
this.setState({userName: value})
58+
},
59+
addUser: function () {
60+
PlanetActions.addUser(this.props.currentPlanet.userName + '/' + this.props.currentPlanet.name, this.state.userName)
61+
},
62+
removeUser: function (userName) {
63+
return function () {
64+
PlanetActions.removeUser(this.props.currentPlanet.userName + '/' + this.props.currentPlanet.name, userName)
65+
}.bind(this)
66+
},
3267
doubleCheckDeletePlanet: function () {
3368
if (this.state.isDeletePlanetChecked) {
3469
console.log('delete it')
@@ -72,7 +107,7 @@ module.exports = React.createClass({
72107
<img className='userPhoto' width='44' height='44' src='../vendor/dummy.jpg'/>
73108
<div className='userName'>{user.name}</div>
74109
<div className='userControl'>
75-
{this.props.currentPlanet.OwnerId !== user.id ? <button className='btn-default'>Delete</button> : <span className='ownerLabel'>Owner</span>}
110+
{this.props.currentPlanet.OwnerId !== user.id ? <button onClick={this.removeUser(user.name)} className='btn-default'>Delete</button> : <span className='ownerLabel'>Owner</span>}
76111
</div>
77112
</li>
78113
)
@@ -86,8 +121,15 @@ module.exports = React.createClass({
86121
<div className='addUserForm'>
87122
<div className='addUserLabel'>Invite user</div>
88123
<div className='addUserControl'>
89-
<Select className='addUserSelect'/>
90-
<button className='addUserSubmit btn-primary'>Invite</button>
124+
<Select
125+
name='userName'
126+
value={this.state.userName}
127+
placeholder='Username'
128+
asyncOptions={getOptions}
129+
onChange={this.handleChange}
130+
className='addUserSelect'
131+
/>
132+
<button onClick={this.addUser} className='addUserSubmit btn-primary'>Invite</button>
91133
</div>
92134
</div>
93135
</div>

browser/main/Containers/PlanetContainer.jsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,24 @@ module.exports = React.createClass({
220220
return
221221
}
222222

223+
if (res.status === 'userRemoved') {
224+
var user = res.data
225+
if (user == null) {
226+
return null
227+
}
228+
this.state.currentPlanet.Users.some(function (_user, index) {
229+
if (user.id === _user.id) {
230+
this.state.currentPlanet.Users.splice(index, 1)
231+
return true
232+
}
233+
return false
234+
}.bind(this))
235+
this.setState({currentPlanet: this.state.currentPlanet}, function () {
236+
if (this.state.isAddUserModalOpen) {this.closeAddUserModal()}
237+
})
238+
return
239+
}
240+
223241
if (res.status === 'nameChanged') {
224242
var params = Object.assign({}, this.props.params)
225243
params.planetName = res.data.name

browser/main/Stores/PlanetStore.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ var PlanetStore = Reflux.createStore({
1212
this.listenTo(PlanetActions.fetchPlanet, this.fetchPlanet)
1313
this.listenTo(PlanetActions.changeName, this.changeName)
1414
this.listenTo(PlanetActions.addUser, this.addUser)
15+
this.listenTo(PlanetActions.removeUser, this.removeUser)
1516
this.listenTo(PlanetActions.createSnippet, this.createSnippet)
1617
this.listenTo(PlanetActions.updateSnippet, this.updateSnippet)
1718
this.listenTo(PlanetActions.deleteSnippet, this.deleteSnippet)
@@ -133,6 +134,27 @@ var PlanetStore = Reflux.createStore({
133134
})
134135
}.bind(this))
135136
},
137+
removeUser: function (planetName, userName) {
138+
request
139+
.del(apiUrl + planetName + '/users')
140+
.set({
141+
Authorization: 'Bearer ' + localStorage.getItem('token')
142+
})
143+
.send({name: userName})
144+
.end(function (err, res) {
145+
if (err) {
146+
console.error(err)
147+
this.trigger(null)
148+
return
149+
}
150+
var user = res.body
151+
152+
this.trigger({
153+
status: 'userRemoved',
154+
data: user
155+
})
156+
}.bind(this))
157+
},
136158
createSnippet: function (planetName, input) {
137159
input.description = input.description.substring(0, 255)
138160
request

0 commit comments

Comments
 (0)