Created
May 12, 2016 19:25
-
-
Save thenickcox/c6d7311f8da576a15ed6108d699721c2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import McFly from 'mcfly'; | |
const Flux = new McFly(); | |
import WeekStore from './week_store.js'; | |
let _blocks = {}; | |
let _persisted = {}; | |
let _trainingModule = {}; | |
let _editableBlockIds = []; | |
let _editingAddedBlock = false; | |
const setBlocks = (data, persisted = false) => { | |
data.map((week) => { | |
week.blocks.map((block) => { | |
_blocks[block.id] = block; | |
if (persisted) { | |
_persisted[block.id] = $.extend(true, {}, block); | |
} | |
}); | |
}); | |
BlockStore.emitChange(); | |
}; | |
const updatePersisted = () => { | |
Object.keys(_blocks).map((blockId) => { | |
_persisted[blockId] = $.extend(true, {}, _blocks[blockId]); | |
}); | |
}; | |
const setBlock = (data, quiet) => { | |
_blocks[data.id] = data; | |
if (!quiet) { | |
BlockStore.emitChange(); | |
} | |
}; | |
const setTrainingModule = (module) => { | |
_trainingModule = module; | |
BlockStore.emitChange() | |
}; | |
const addBlock = (weekId) => { | |
weekBlocks = _.reject(BlockStore.getBlocksInWeek(weekId), (block) => block.deleted); | |
const block = { | |
id: Date.now(), | |
is_new: true, | |
kind: 0, | |
title: "", | |
content: "", | |
gradeable_id: null, | |
week_id: week_id, | |
order: week_blocks.length, | |
duration: null | |
}; | |
setBlock(block); | |
setEditableBlockId(block.id); | |
} | |
removeBlock = (blockId) => { | |
delete(_blocks[blockId]); | |
_editingAddedBlock = false; | |
BlockStore.emitChange(); | |
} | |
const insertBlock = (block, toWeek, targetIndex) => { | |
const fromWeekId = block.week_id; | |
block.week_id = toWeek.id; | |
if (targetIndex) { | |
if (toWeek.id == fromWeekId) { | |
block.order = block.order > targetIndex ? targetIndex - .5 : targetIndex + .5; | |
} else { | |
const fromWeek = WeekStore.getWeek(fromWeekId); | |
block.order = fromWeek.order > toWeek.order ? targetIndex + 999 : targetIndex - .5; | |
} | |
} else { | |
block.order = -1 | |
} | |
setBlock(block, true); | |
const fromWeekBlocks = BlockStore.getBlocksInWeek(fromWeekId); | |
fromWeekBlocks.forEach((block, i) => { | |
b.order = i; | |
setBlock(block, true); | |
}); | |
if (fromWeekId != toWeek.id) { | |
const toWeekBlocks = BlockStore.getBlocksInWeek(toWeek.id); | |
toWeekBlocks.forEach((block, i) => { | |
b.order = i; | |
setBlock(b, true); | |
}); | |
BlockStore.emitChange() | |
}; | |
const isAddedBlock = (blockId) => { | |
// new block ids are set to Date.now() | |
blockId > 1000000000 | |
}; | |
const setEditableBlockId = (blockId) => { | |
_editableBlockIds.push(blockId); | |
_editingAddedBlock = isAddedBlock(blockId); | |
BlockStore.emitChange(); | |
}; | |
const BlockStore = Flux.createStore({ | |
getBlock(blockId) { | |
return _blocks[blockId]; | |
}, | |
getBlocks() { | |
const blockList = []; | |
Object.keys(_blocks).map((blockId) => { | |
blockList.push(_blocks[block_id]); | |
}); | |
return blockList; | |
}, | |
getBlocksInWeek(week_id) { | |
const blocks = _.filter(_blocks, (block) => { block.week_id === week_id }); | |
return blocks.sort((a,b) => { a.order - b.order }); | |
}, | |
restore() { | |
_blocks = $.extend(true, {}, _persisted); | |
_editingAddedBlock = false; | |
BlockStore.emitChange(); | |
}, | |
getTrainingModule() { | |
return _trainingModule; | |
}, | |
getEditableBlockIds() { | |
return _editableBlockIds; | |
}, | |
clearEditableBlockIds() { | |
_editableBlockIds = []; | |
BlockStore.emitChange(); | |
}, | |
cancelBlockEditable(blockId) { | |
_editableBlockIds.splice(_editableBlockIds.indexOf(blockId), 1); | |
_editingAddedBlock = false; | |
BlockStore.emitChange() | |
}, | |
editingAddedBlock() { | |
return _editingAddedBlock; | |
} | |
}, function(payload) { | |
const data = payload.data; | |
switch(payload.actionType) { | |
case 'RECEIVE_TIMELINE': | |
case 'SAVED_TIMELINE': | |
case 'WIZARD_SUBMITTED': | |
_blocks = {}; | |
setBlocks(data.course.weeks, true); | |
break; | |
case 'ADD_BLOCK': | |
addBlock(data.week_id); | |
break; | |
case 'UPDATE_BLOCK': | |
setBlock(data.block, data.quiet); | |
break; | |
case 'DELETE_BLOCK': | |
removeBlock(data.block_id); | |
break; | |
case 'INSERT_BLOCK': | |
insertBlock(data.block, data.toWeek, data.afterBlock); | |
break; | |
case 'SET_BLOCK_EDITABLE': | |
setEditableBlockId(data.block_id); | |
break; | |
} | |
return true; | |
}); | |
export default BlockStore; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment