mirror of
https://github.com/roleypoly/roleypoly-v1.git
synced 2025-04-25 12:19:10 +00:00
MVP: finish give/remove roles practical example
This commit is contained in:
parent
3c545bdeaa
commit
d1f556b0f0
6 changed files with 82 additions and 29 deletions
|
@ -24,4 +24,24 @@ module.exports = (R, $) => {
|
||||||
|
|
||||||
ctx.body = server
|
ctx.body = server
|
||||||
})
|
})
|
||||||
|
|
||||||
|
R.patch('/api/servers/:server/roles', async ctx => {
|
||||||
|
const { userId } = ctx.session
|
||||||
|
const { server } = ctx.params
|
||||||
|
let gm = $.discord.gm(server, userId)
|
||||||
|
|
||||||
|
const { added, removed } = ctx.request.body
|
||||||
|
|
||||||
|
if (added.length > 0) {
|
||||||
|
gm = await gm.addRoles(added)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (removed.length > 0) {
|
||||||
|
gm = await gm.removeRoles(removed)
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(gm.roles)
|
||||||
|
|
||||||
|
ctx.body = { ok: true }
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
43
UI/src/components/role-picker/Category.js
Normal file
43
UI/src/components/role-picker/Category.js
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
import React, { Component } from 'react'
|
||||||
|
import { Map } from 'immutable'
|
||||||
|
|
||||||
|
import Role from '../role'
|
||||||
|
|
||||||
|
class Category extends Component {
|
||||||
|
|
||||||
|
toggleRoleMulti (id, next) {
|
||||||
|
this.props.onChange(Map({ [id]: next }))
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleRoleSingle (id, next) {
|
||||||
|
this.props.onChange(this.props.category.get('roles').reduce((acc, i) => acc.set(i, false), Map()).set(id, next))
|
||||||
|
}
|
||||||
|
|
||||||
|
onRoleToggle = id => (next, old) => {
|
||||||
|
const type = this.props.category.get('type')
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case 'multi': return this.toggleRoleMulti(id, next)
|
||||||
|
case 'single': return this.toggleRoleSingle(id, next)
|
||||||
|
default: console.warn('NOT SURE')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
const { category, name, isSelected } = this.props
|
||||||
|
if (category.get('hidden')) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return <div key={name} className="role-picker__category">
|
||||||
|
<h4>{ name }</h4>
|
||||||
|
{
|
||||||
|
category.get('roles_map').map((r, k) => {
|
||||||
|
const id = r.get('id')
|
||||||
|
return <Role key={k} role={r} selected={isSelected(id)} onToggle={this.onRoleToggle(id)}/>
|
||||||
|
}).toArray()
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default Category
|
|
@ -38,7 +38,7 @@
|
||||||
|
|
||||||
.action__button
|
.action__button
|
||||||
border: 0
|
border: 0
|
||||||
border-radius: 5px
|
border-radius: 2px
|
||||||
transition: transform 0.2s ease-out, box-shadow 0.2s ease-out
|
transition: transform 0.2s ease-out, box-shadow 0.2s ease-out
|
||||||
position: relative
|
position: relative
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@
|
||||||
right: 0
|
right: 0
|
||||||
left: 0
|
left: 0
|
||||||
background-color: rgba(0,0,0,0.1)
|
background-color: rgba(0,0,0,0.1)
|
||||||
border-radius: 5px
|
border-radius: 2px
|
||||||
opacity: 0
|
opacity: 0
|
||||||
transition: opacity 0.15s ease-in-out
|
transition: opacity 0.15s ease-in-out
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,6 @@
|
||||||
import { Map, Set, fromJS } from 'immutable'
|
import { Map, Set, fromJS } from 'immutable'
|
||||||
import superagent from 'superagent'
|
import superagent from 'superagent'
|
||||||
|
|
||||||
export const roleUpdate = (id, oldState) => (dispatch, getState) => {
|
|
||||||
dispatch({
|
|
||||||
type: Symbol.for('update selected roles'),
|
|
||||||
data: {
|
|
||||||
id,
|
|
||||||
state: !oldState
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export const setup = id => async dispatch => {
|
export const setup = id => async dispatch => {
|
||||||
// const rsp = await superagent.get(`/api/server/${id}`)
|
// const rsp = await superagent.get(`/api/server/${id}`)
|
||||||
|
@ -89,4 +80,13 @@ export const submitSelected = serverId => async (dispatch, getState) => {
|
||||||
}, Map({ added: Set(), removed: Set() }))
|
}, Map({ added: Set(), removed: Set() }))
|
||||||
|
|
||||||
await superagent.patch(`/api/servers/${serverId}/roles`).send(diff.toJS())
|
await superagent.patch(`/api/servers/${serverId}/roles`).send(diff.toJS())
|
||||||
|
|
||||||
|
dispatch({
|
||||||
|
type: Symbol.for('sync selected roles')
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const updateRoles = roles => ({
|
||||||
|
type: Symbol.for('update selected roles'),
|
||||||
|
data: roles
|
||||||
|
})
|
||||||
|
|
|
@ -4,7 +4,7 @@ import superagent from 'superagent'
|
||||||
import * as Actions from './actions'
|
import * as Actions from './actions'
|
||||||
import './RolePicker.sass'
|
import './RolePicker.sass'
|
||||||
|
|
||||||
import Role from '../role'
|
import Category from './Category'
|
||||||
import { Scrollbars } from 'react-custom-scrollbars';
|
import { Scrollbars } from 'react-custom-scrollbars';
|
||||||
|
|
||||||
const mapState = ({ rolePicker, servers }, ownProps) => {
|
const mapState = ({ rolePicker, servers }, ownProps) => {
|
||||||
|
@ -28,7 +28,7 @@ class RolePicker extends Component {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
isSelected (id) {
|
isSelected = id => {
|
||||||
return this.props.data.getIn([ 'rolesSelected', id ])
|
return this.props.data.getIn([ 'rolesSelected', id ])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,27 +62,14 @@ class RolePicker extends Component {
|
||||||
<button disabled={!this.rolesHaveChanged} onClick={() => dispatch(Actions.resetSelected)} className="uk-button action__button secondary">
|
<button disabled={!this.rolesHaveChanged} onClick={() => dispatch(Actions.resetSelected)} className="uk-button action__button secondary">
|
||||||
Reset
|
Reset
|
||||||
</button>
|
</button>
|
||||||
<button disabled={!this.rolesHaveChanged} onClick={() => dispatch(Actions.submitSelected(server.id))} className="uk-button action__button primary">
|
<button disabled={!this.rolesHaveChanged} onClick={() => dispatch(Actions.submitSelected(this.props.match.params.server))} className="uk-button action__button primary">
|
||||||
Save Changes
|
Save Changes
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="role-picker__categories">
|
<div className="role-picker__categories">
|
||||||
{
|
{
|
||||||
vm.map((c, name) => {
|
vm.map((c, name) => <Category name={name} category={c} isSelected={this.isSelected} onChange={(roles) => dispatch(Actions.updateRoles(roles))} />).toArray()
|
||||||
if (c.get('hidden')) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
return <div key={name} className="role-picker__category">
|
|
||||||
<h4>{ name }</h4>
|
|
||||||
{
|
|
||||||
c.get('roles_map').map((r, k) => {
|
|
||||||
return <Role key={k} role={r} selected={this.isSelected(r.get('id'))} onToggle={() => this.props.dispatch(Actions.roleUpdate(r.get('id'), this.isSelected(r.get('id'))))} />
|
|
||||||
}).toArray()
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
}).toArray()
|
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
@ -20,7 +20,10 @@ export default (state = initialState, { type, data }) => {
|
||||||
return state.set('emptyRoles', data)
|
return state.set('emptyRoles', data)
|
||||||
|
|
||||||
case Symbol.for('update selected roles'):
|
case Symbol.for('update selected roles'):
|
||||||
return state.setIn(['rolesSelected', data.id], data.state)
|
return state.mergeIn(['rolesSelected'], data)
|
||||||
|
|
||||||
|
case Symbol.for('sync selected roles'):
|
||||||
|
return state.set('originalRolesSelected', state.get('rolesSelected'))
|
||||||
|
|
||||||
case Symbol.for('reset selected'):
|
case Symbol.for('reset selected'):
|
||||||
return state.set('rolesSelected', state.get('originalRolesSelected'))
|
return state.set('rolesSelected', state.get('originalRolesSelected'))
|
||||||
|
|
Loading…
Add table
Reference in a new issue