-
+
Create new folder
diff --git a/lib/components/modal/CreateNewTeam.js b/lib/components/modal/CreateNewTeam.js
index bd1d4211..f72dd52d 100644
--- a/lib/components/modal/CreateNewTeam.js
+++ b/lib/components/modal/CreateNewTeam.js
@@ -140,8 +140,7 @@ export default class CreateNewTeam extends React.Component {
handleMemberDeleteButtonClick (name) {
let selectState = this.state.select
let input = {
- name: name,
- role: 'member'
+ name: name
}
return e => {
@@ -175,15 +174,7 @@ export default class CreateNewTeam extends React.Component {
setMember(selectState.team.id, input)
.then(res => {
- let selectState = this.state.select
- let team = res.body
- team.Members = team.Members.sort((a, b) => {
- return new Date(a._pivot_createdAt) - new Date(b._pivot_createdAt)
- })
- selectState.team = team
- selectState.newMember = ''
-
- this.setState({select: selectState})
+ console.log(res.body)
})
.catch(err => {
if (err.status != null) throw err
diff --git a/lib/components/modal/Preference/AppSettingTab.js b/lib/components/modal/Preference/AppSettingTab.js
new file mode 100644
index 00000000..7f0f874d
--- /dev/null
+++ b/lib/components/modal/Preference/AppSettingTab.js
@@ -0,0 +1,40 @@
+import React, { PropTypes } from 'react'
+
+export default class AppSettingTab extends React.Component {
+ render () {
+ return (
+
+
+
Hotkey
+
+
+
+
+
+
+
+
+
+ 0 to 9
+ A to Z
+ F1 to F24
+ - Punctuations like
~, !, @, #, $, etc.
+ Plus
+ Space
+ Backspace
+ Delete
+ Insert
+ Return (or Enter as alias)
+ Up, Down, Left and Right
+ Home and End
+ PageUp and PageDown
+ Escape (or Esc for short)
+ VolumeUp, VolumeDown and VolumeMute
+ MediaNextTrack, MediaPreviousTrack, MediaStop and MediaPlayPause
+
+
+
+
+ )
+ }
+}
diff --git a/lib/components/modal/Preference/FolderRow.js b/lib/components/modal/Preference/FolderRow.js
new file mode 100644
index 00000000..0c9355d2
--- /dev/null
+++ b/lib/components/modal/Preference/FolderRow.js
@@ -0,0 +1,121 @@
+import React, { PropTypes } from 'react'
+import api from 'boost/api'
+import linkState from 'boost/linkState'
+import FolderMark from 'boost/components/FolderMark'
+
+const IDLE = 'IDLE'
+const EDIT = 'EDIT'
+const DELETE = 'DELETE'
+
+export default class FolderRow extends React.Component {
+ constructor (props) {
+ super(props)
+
+ this.state = {
+ mode: IDLE,
+ name: props.folder.name,
+ public: props.folder.public
+ }
+ }
+
+ handleCancelButtonClick (e) {
+ this.setState({
+ mode: IDLE,
+ name: this.props.folder.name,
+ public: this.props.folder.public
+ })
+ }
+
+ handleEditButtonClick (e) {
+ this.setState({mode: EDIT})
+ }
+
+ handleDeleteButtonClick (e) {
+ this.setState({mode: DELETE})
+ }
+
+ handleFolderPublicChange (e) {
+ this.setState({public: e.target.value})
+ }
+
+ handleSaveButtonClick (e) {
+ let input = {
+ name: this.state.name,
+ public: !!parseInt(this.state.public, 10)
+ }
+
+ api.updateFolder(this.props.folder.id, input)
+ .then(res => {
+ console.log(res.body)
+ this.setState({mode: IDLE})
+ })
+ .catch(err => {
+ if (err.status != null) throw err
+ else console.error(err)
+ })
+ }
+
+ handleDeleteConfirmButtonClick (e) {
+ api.destroyFolder(this.props.folder.id)
+ .then(res => {
+ console.log(res.body)
+ })
+ .catch(err => {
+ if (err.status != null) throw err
+ else console.error(err)
+ })
+ }
+
+ render () {
+ let folder = this.props.folder
+
+ switch (this.state.mode) {
+ case EDIT:
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+ case DELETE:
+ return (
+
+
Are you sure to delete {folder.name} folder?
+
+
+
+
+
+ )
+ case IDLE:
+ default:
+ return (
+
+
{folder.name}
+
{folder.public ? 'Public' : 'Private'}
+
+
+
+
+
+ )
+ }
+ }
+}
+
+FolderRow.propTypes = {
+ folder: PropTypes.shape()
+}
+
+FolderRow.prototype.linkState = linkState
diff --git a/lib/components/modal/Preference/FolderSettingTab.js b/lib/components/modal/Preference/FolderSettingTab.js
new file mode 100644
index 00000000..776b7501
--- /dev/null
+++ b/lib/components/modal/Preference/FolderSettingTab.js
@@ -0,0 +1,63 @@
+import React, { PropTypes } from 'react'
+import _ from 'lodash'
+import FolderRow from './FolderRow'
+
+export default class FolderSettingTab extends React.Component {
+
+ getCurrentTeam (props) {
+ if (props == null) props = this.props
+ return _.findWhere(props.teams, {id: props.currentTeamId})
+ }
+
+ handleTeamSelectChange (e) {
+ this.props.switchTeam(e.target.value)
+ }
+
+ renderTeamOptions () {
+ return this.props.teams.map(team => {
+ return (
+
)
+ })
+ }
+
+ render () {
+ let team = this.getCurrentTeam()
+ console.log(team.Folders)
+ let folderElements = team.Folders.map(folder => {
+ return (
+
+ )
+ })
+
+ return (
+
+
+ Setting of
+
+
+
+
Folders
+
+
+
Folder name
+
Public/Private
+
Edit/Delete
+
+ {folderElements}
+
+
+
+ )
+ }
+}
+
+FolderSettingTab.propTypes = {
+ currentTeamId: PropTypes.number,
+ teams: PropTypes.array,
+ switchTeam: PropTypes.func
+}
diff --git a/lib/components/modal/Preference/HelpTab.js b/lib/components/modal/Preference/HelpTab.js
new file mode 100644
index 00000000..ac3e2f1e
--- /dev/null
+++ b/lib/components/modal/Preference/HelpTab.js
@@ -0,0 +1,11 @@
+import React, { PropTypes } from 'react'
+
+export default class HelpTab extends React.Component {
+ render () {
+ return (
+
+ Comming soon
+
+ )
+ }
+}
diff --git a/lib/components/modal/Preference/MemberSettingTab.js b/lib/components/modal/Preference/MemberSettingTab.js
new file mode 100644
index 00000000..50de5420
--- /dev/null
+++ b/lib/components/modal/Preference/MemberSettingTab.js
@@ -0,0 +1,206 @@
+import React, { PropTypes } from 'react'
+import ProfileImage from 'boost/components/ProfileImage'
+import Select from 'react-select'
+import api from 'boost/api'
+import _ from 'lodash'
+
+function getUsers (input, cb) {
+ api.searchUser(input)
+ .then(function (res) {
+ let users = res.body
+
+ cb(null, {
+ options: users.map(user => {
+ return { value: user.name, label: user.name }
+ }),
+ complete: false
+ })
+ })
+ .catch(function (err) {
+ console.error(err)
+ })
+}
+
+export default class MemberSettingTab extends React.Component {
+ constructor (props) {
+ super(props)
+
+ this.state = {
+ newMember: ''
+ }
+ }
+
+ getCurrentTeam (props) {
+ if (props == null) props = this.props
+ return _.findWhere(props.teams, {id: props.currentTeamId})
+ }
+
+ handleTeamSelectChange (e) {
+ this.props.switchTeam(e.target.value)
+ }
+
+ handleNewMemberChange (value) {
+ this.setState({newMember: value})
+ }
+
+ handleClickAddMemberButton (e) {
+ let team = this.getCurrentTeam()
+ if (team == null || team.userType !== 'team') return null
+
+ let input = {
+ name: this.state.newMember,
+ role: 'member'
+ }
+ api.setMember(team.id, input)
+ .then(res => {
+ console.log(res.body)
+ })
+ .catch(err => {
+ if (err.status != null) throw err
+ else console.error(err)
+ })
+ }
+ handleMemberRoleChange (name) {
+ return e => {
+ let team = this.getCurrentTeam()
+ let input = {
+ name: name,
+ role: e.target.value
+ }
+
+ api.setMember(team.id, input)
+ .then(res => {
+ console.log(res.body)
+ })
+ .catch(err => {
+ if (err.status != null) throw err
+ else console.error(err)
+ })
+ }
+ }
+
+ handleMemberDeleteButtonClick (name) {
+ return e => {
+ let team = this.getCurrentTeam()
+ let input = {
+ name: name
+ }
+
+ api.deleteMember(team.id, input)
+ .then(res => {
+ console.log(res.body)
+ })
+ .catch(err => {
+ if (err.status != null) throw err
+ else console.error(err)
+ })
+ }
+ }
+
+ renderTeamOptions () {
+ return this.props.teams.map(team => {
+ return (
+ )
+ })
+ }
+
+ render () {
+ console.log(this.props.teams)
+
+ let team = this.getCurrentTeam()
+
+ if (team == null || team.userType === 'person') {
+ return this.renderNoTeam()
+ }
+
+ let membersEl = team.Members.map(member => {
+ let isCurrentUser = this.props.currentUser.id === member.id
+
+ return (
+
+
+
+
+
{`${member.profileName} (${member.name})`}
+
{member.email}
+
+
+
+
+
+
+
+
+
+
+ )
+ })
+
+ return (
+
+
+ Setting of
+
+
+
+
+
Members
+
+
Add member
+
+
+
+
+ -
+
Username
+ Role
+ Delete
+
+ {membersEl}
+
+
+
+ )
+ }
+
+ renderNoTeam () {
+ return (
+
+
+ Setting of
+
+
+
Please select a team
+
+ )
+ }
+}
+
+MemberSettingTab.propTypes = {
+ currentUser: PropTypes.shape(),
+ teams: PropTypes.array,
+ currentTeamId: PropTypes.number,
+ switchTeam: PropTypes.func
+}
diff --git a/lib/components/modal/Preference/TeamSettingTab.js b/lib/components/modal/Preference/TeamSettingTab.js
new file mode 100644
index 00000000..b375d2ca
--- /dev/null
+++ b/lib/components/modal/Preference/TeamSettingTab.js
@@ -0,0 +1,155 @@
+import React, { PropTypes } from 'react'
+import _ from 'lodash'
+import linkState from 'boost/linkState'
+import api from 'boost/api'
+
+export default class TeamSettingTab extends React.Component {
+ constructor (props) {
+ super(props)
+ let team = this.getCurrentTeam(props)
+ this.state = {
+ teamName: team != null ? team.profileName : '',
+ deleteConfirm: false,
+ alert: null
+ }
+ }
+
+ componentWillReceiveProps (nextProps) {
+ let team = this.getCurrentTeam(nextProps)
+
+ this.setState({
+ teamName: team != null ? team.profileName : '',
+ deleteConfirm: false
+ })
+ }
+
+ getCurrentTeam (props) {
+ if (props == null) props = this.props
+ return _.findWhere(props.teams, {id: props.currentTeamId})
+ }
+
+ handleTeamSelectChange (e) {
+ this.props.switchTeam(e.target.value)
+ }
+
+ handleSaveButtonClick (e) {
+ let input = {
+ profileName: this.state.teamName
+ }
+ let alert = {
+ type: 'info',
+ message: 'Sending...'
+ }
+ this.setState({alert}, () => {
+ api.updateTeamInfo(this.props.currentTeamId, input)
+ .then(res => {
+ console.log(res.body)
+ let alert = {
+ type: 'success',
+ message: 'Successfully done!'
+ }
+ this.setState({alert})
+ })
+ .catch(err => {
+ var message
+ if (err.status != null) {
+ message = err.response.body.message
+ } else if (err.code === 'ECONNREFUSED') {
+ message = 'Can\'t connect to API server.'
+ } else throw err
+
+ let alert = {
+ type: 'error',
+ message: message
+ }
+
+ this.setState({alert})
+ })
+ })
+ }
+
+ renderTeamOptions () {
+ return this.props.teams.map(team => {
+ return (
+ )
+ })
+ }
+
+ render () {
+ let team = this.getCurrentTeam()
+
+ if (team == null || team.userType === 'person') {
+ return this.renderNoTeam()
+ }
+
+ return (
+
+
+ Setting of
+
+
+
+
Team profile
+
+
+
+
+
+
+
+ {this.state.alert != null
+ ? (
+
{this.state.alert.message}
+ )
+ : null}
+
+
+
+ {!this.state.deleteConfirm
+ ? (
+
+
+
+
+ )
+ : (
+
+
+
+
+
+ )}
+
+ )
+ }
+
+ renderNoTeam () {
+ return (
+
+
+ Setting of
+
+
+
Please select a team
+
+ )
+ }
+}
+
+TeamSettingTab.propTypes = {
+ currentTeamId: PropTypes.number,
+ teams: PropTypes.array,
+ switchTeam: PropTypes.func
+}
+
+TeamSettingTab.prototype.linkState = linkState
diff --git a/lib/components/modal/Preferences.js b/lib/components/modal/Preferences.js
index 87ceedb0..5c69af53 100644
--- a/lib/components/modal/Preferences.js
+++ b/lib/components/modal/Preferences.js
@@ -1,43 +1,31 @@
import React, { PropTypes } from 'react'
import { connect, Provider } from 'react-redux'
-import auth from 'boost/auth'
import linkState from 'boost/linkState'
-import Select from 'react-select'
import api from 'boost/api'
-import ProfileImage from 'boost/components/ProfileImage'
import store from 'boost/store'
+import AppSettingTab from './Preference/AppSettingTab'
+import HelpTab from './Preference/HelpTab'
+import TeamSettingTab from './Preference/TeamSettingTab'
+import MemberSettingTab from './Preference/MemberSettingTab'
+import FolderSettingTab from './Preference/FolderSettingTab'
+import { closeModal } from 'boost/modal'
+
var { findDOMNode } = require('react-dom')
const PROFILE = 'PROFILE'
-const PREFERENCES = 'PREFERENCES'
+const APP = 'APP'
const HELP = 'HELP'
const TEAM = 'TEAM'
const MEMBER = 'MEMBER'
const FOLDER = 'FOLDER'
-function getUsers (input, cb) {
- api.searchUser(input)
- .then(function (res) {
- let users = res.body
-
- cb(null, {
- options: users.map(user => {
- return { value: user.name, label: user.name }
- }),
- complete: false
- })
- })
- .catch(function (err) {
- console.error(err)
- })
-}
-
class Preferences extends React.Component {
constructor (props) {
super(props)
this.state = {
currentTab: PROFILE,
+ currentTeamId: props.status.userId,
profile: {
userInfo: {
profileName: props.currentUser.profileName,
@@ -54,6 +42,10 @@ class Preferences extends React.Component {
}
}
+ switchTeam (teamId) {
+ this.setState({currentTeamId: teamId})
+ }
+
handleNavButtonClick (tab) {
return e => {
this.setState({currentTab: tab})
@@ -65,7 +57,7 @@ class Preferences extends React.Component {
let tabs = [
{target: PROFILE, label: 'Profile'},
- {target: PREFERENCES, label: 'Preferences'},
+ {target: APP, label: 'Preferences'},
{target: HELP, label: 'Help & Feedback'},
{target: TEAM, label: 'Team setting'},
{target: MEMBER, label: 'Manage member'},
@@ -80,7 +72,7 @@ class Preferences extends React.Component {
Setting
-
+
@@ -93,17 +85,39 @@ class Preferences extends React.Component {
}
renderContent () {
+ let currentTeamId = parseInt(this.state.currentTeamId, 10)
+ let teams = [this.props.currentUser].concat(this.props.currentUser.Teams)
+
switch (this.state.currentTab) {
- case PREFERENCES:
- return this.renderPreferences()
+ case APP:
+ return (
)
case HELP:
- return this.renderHelp()
+ return (
)
case TEAM:
- return this.renderTeamSetting()
+ return (
+
this.switchTeam(teamId)}
+ />
+ )
case MEMBER:
- return this.renderMemberSetting()
+ return (
+ this.switchTeam(teamId)}
+ />
+ )
case FOLDER:
- return this.renderFolderSetting()
+ return (
+ this.switchTeam(teamId)}
+ />
+ )
case PROFILE:
default:
return this.renderProfile()
@@ -250,7 +264,7 @@ class Preferences extends React.Component {
- {this.state.profile.password.alert != null
+ {profileState.password.alert != null
? (
{profileState.password.alert.message}
)
@@ -261,144 +275,6 @@ class Preferences extends React.Component {
)
}
- renderPreferences () {
- return (
-
-
-
Hotkey
-
-
-
-
-
-
-
-
-
- 0 to 9
- A to Z
- F1 to F24
- - Punctuations like
~, !, @, #, $, etc.
- Plus
- Space
- Backspace
- Delete
- Insert
- Return (or Enter as alias)
- Up, Down, Left and Right
- Home and End
- PageUp and PageDown
- Escape (or Esc for short)
- VolumeUp, VolumeDown and VolumeMute
- MediaNextTrack, MediaPreviousTrack, MediaStop and MediaPlayPause
-
-
-
-
- )
- }
-
- renderHelp () {
- return (
-
- Comming soon
-
- )
- }
-
- renderTeamSetting () {
- return (
-
-
-
-
's Team Setting
-
-
-
Team profile
-
-
-
-
-
-
- {false
- ? (
-
-
Delete this team
-
-
- )
- : (
-
-
Are you sure to delete this team?
-
-
-
- )}
-
- )
- }
-
- renderMemberSetting () {
- let membersEl = [].map(member => {
- let isCurrentUser = this.state.currentUser.id === member.id
-
- return (
-
-
-
-
{`${member.profileName} (${member.name})`}
-
{member.email}
-
-
-
-
-
-
-
- )
- })
-
- return (
-
-
-
-
's Team Setting
-
-
-
-
-
-
- )
- }
-
- renderFolderSetting () {
- return (
-
- )
- }
-
}
Preferences.propTypes = {
@@ -410,9 +286,11 @@ Preferences.prototype.linkState = linkState
function remap (state) {
let currentUser = state.currentUser
+ let status = state.status
return {
- currentUser
+ currentUser,
+ status
}
}
diff --git a/lib/modal.js b/lib/modal.js
index d58f69f7..ae720490 100644
--- a/lib/modal.js
+++ b/lib/modal.js
@@ -38,5 +38,5 @@ export function openModal (component, props) {
export function closeModal () {
if (modalBase == null) { return }
- modalBase.setState({isHidden: true})
+ modalBase.setState({component: null, componentProps: null, isHidden: true})
}
diff --git a/package.json b/package.json
index 2ae21f9e..09d0b23c 100644
--- a/package.json
+++ b/package.json
@@ -60,7 +60,7 @@
"react-dom": "^0.14.0",
"react-redux": "^3.1.0",
"react-router": "^1.0.0-rc1",
- "react-select": "^0.6.10",
+ "react-select": "^0.8.1",
"react-transform-catch-errors": "^1.0.0",
"react-transform-hmr": "^1.0.1",
"redbox-react": "^1.1.1",