diff --git a/UI/src/components/role-editor/actions.js b/UI/src/components/role-editor/actions.js index 7807528..04fa3af 100644 --- a/UI/src/components/role-editor/actions.js +++ b/UI/src/components/role-editor/actions.js @@ -1,4 +1,4 @@ -import { Set } from 'immutable' +import { OrderedMap, Set } from 'immutable' import * as UIActions from '../../actions/ui' import { getViewMap, setup } from '../role-picker/actions' import uuidv4 from 'uuid/v4' @@ -138,34 +138,40 @@ export const createCategory = (dispatch, getState) => { }) } -export const bumpCategory = (category, name) => (move) => async (dispatch, getState) => { +export const bumpCategory = (category, id) => (move) => async (dispatch, getState) => { + console.log({ category, id, move }) const { roleEditor } = getState() const vm = roleEditor.get('viewMap') + const vmSeq = vm.valueSeq().filterNot((item) => item.get('name') === 'Uncategorized') + console.log({ vm, vmSeq }) - const position = category.get('position') - const nextPos = position + move + const oldPosition = vmSeq.findKey((item) => item.get('id') === id) + const newPosition = Math.max(0, Math.min(vm.size - 1, oldPosition + move)) + console.log({ oldPosition, newPosition }) - const replaceThisOne = vm.findKey((category) => category.get('position') === nextPos) + const vmSeqExcludingBump = vmSeq.splice(oldPosition, 1) + + console.log({ vmSeqExcludingBump: vmSeqExcludingBump.toJS() }) + const vmSeqWithBump = vmSeqExcludingBump + .slice(0, newPosition) + .concat([category]) + .concat(vmSeqExcludingBump.slice(newPosition)) + + console.log({ vmSeqWithBump: vmSeqWithBump.toJS() }) + const vmSeqNewOrdering = vmSeqWithBump + .map((item, idx) => item.set('position', idx)) + .sortBy((item) => item.get('position')) + + console.log({ vmSeqNewOrdering: vmSeqNewOrdering.toJS() }) + const newVm = vmSeqNewOrdering + // .add(vm.find((item) => item.get('name') === 'Uncategorized')) + .reduce((acc, item) => acc.set(item.get('id'), item), OrderedMap()) + .set('Uncategorized', vm.get('Uncategorized')) dispatch({ - type: Symbol.for('re: edit category'), - data: { - id: name, - key: 'position', - value: nextPos, - }, + type: Symbol.for('re: replace viewmap'), + data: newVm, }) - - if (!!replaceThisOne) { - dispatch({ - type: Symbol.for('re: edit category'), - data: { - id: replaceThisOne, - key: 'position', - value: position, - }, - }) - } } export const saveServer = (id) => async (dispatch, getState) => { diff --git a/UI/src/components/role-picker/actions.js b/UI/src/components/role-picker/actions.js index b168948..2587cfc 100644 --- a/UI/src/components/role-picker/actions.js +++ b/UI/src/components/role-picker/actions.js @@ -44,17 +44,7 @@ export const getViewMap = (server) => { name: 'Uncategorized', }) ) - .map((cat, idx) => - cat.set( - 'position', - cat.get( - 'position', - categoriesIds.findIndex((v) => v === idx) - ) - ) - ) - // .sortBy(cat => cat.get('position')) - .map((c) => { + .map((c, id) => { const roles = c .get('roles') // fill in roles_map @@ -63,7 +53,10 @@ export const getViewMap = (server) => { // sort by server position, backwards. .sort((a, b) => a.position > b.position) // force data to sets - return c.set('roles_map', Set(roles)).set('roles', Set(c.get('roles'))) + return c + .set('roles_map', Set(roles)) + .set('roles', Set(c.get('roles'))) + .set('id', id) }) const selected = roles.reduce( diff --git a/UI/src/reducers/role-editor.js b/UI/src/reducers/role-editor.js index 1e2ef43..52cb3bc 100644 --- a/UI/src/reducers/role-editor.js +++ b/UI/src/reducers/role-editor.js @@ -16,6 +16,9 @@ const reducer = (state = initialState, { type, data }) => { ...rest, }) + case Symbol.for('re: replace viewmap'): + return state.set('viewMap', data) + case Symbol.for('re: set category'): return state.setIn(['viewMap', data.id], Map(data)) @@ -44,11 +47,11 @@ const reducer = (state = initialState, { type, data }) => { rmCat .set( 'roles', - rmCat.get('roles').filterNot(r => r === data.role.get('id')) + rmCat.get('roles').filterNot((r) => r === data.role.get('id')) ) .set( 'roles_map', - rmCat.get('roles_map').filterNot(r => r.get('id') === data.role.get('id')) + rmCat.get('roles_map').filterNot((r) => r.get('id') === data.role.get('id')) ) )