diff --git a/src/app/components/AvailableModulesMenu.jsx b/src/app/components/AvailableModulesMenu.jsx index 63baf43c..83eb3b4c 100644 --- a/src/app/components/AvailableModulesMenu.jsx +++ b/src/app/components/AvailableModulesMenu.jsx @@ -104,7 +104,10 @@ export default class AvailableModulesMenu extends TranslatedComponent { diffDetails: PropTypes.func, m: PropTypes.object, shipMass: PropTypes.number, - warning: PropTypes.func + warning: PropTypes.func, + firstSlotId: PropTypes.string, + lastSlotId: PropTypes.string, + slotDiv: PropTypes.object }; static defaultProps = { @@ -120,6 +123,7 @@ export default class AvailableModulesMenu extends TranslatedComponent { super(props); this._hideDiff = this._hideDiff.bind(this); this.state = this._initState(props, context); + this.slotItems = [];// Array to hold
  • refs. } /** @@ -130,8 +134,9 @@ export default class AvailableModulesMenu extends TranslatedComponent { */ _initState(props, context) { let translate = context.language.translate; - let { m, warning, shipMass, onSelect, modules } = props; + let { m, warning, shipMass, onSelect, modules, firstSlotId, lastSlotId } = props; let list, currentGroup; + let buildGroup = this._buildGroup.bind( this, translate, @@ -142,15 +147,18 @@ export default class AvailableModulesMenu extends TranslatedComponent { this._hideDiff(event); onSelect(m); } - ); - + ); + if (modules instanceof Array) { list = buildGroup(modules[0].grp, modules); } else { list = []; // At present time slots with grouped options (Hardpoints and Internal) can be empty if (m) { - list.push(
    {translate('empty')}
    ); + let emptyId = 'empty'; + if(this.firstSlotId == null) this.firstSlotId = emptyId; + let keyDown = this._keyDown.bind(this, onSelect); + list.push(
    this.slotItems[emptyId] = slotItem} >{translate('empty')}
    ); } // Need to regroup the modules by our own categorisation @@ -200,8 +208,8 @@ export default class AvailableModulesMenu extends TranslatedComponent { } } } - - return { list, currentGroup }; + let trackingFocus = false; + return { list, currentGroup, trackingFocus}; } /** @@ -215,18 +223,18 @@ export default class AvailableModulesMenu extends TranslatedComponent { * @param {Array} modules Available modules * @return {React.Component} Available Module Group contents */ - _buildGroup(translate, mountedModule, warningFunc, mass, onSelect, grp, modules) { + _buildGroup(translate, mountedModule, warningFunc, mass, onSelect, grp, modules, firstSlotId, lastSlotId) { let prevClass = null, prevRating = null, prevName; let elems = []; - + const sortedModules = modules.sort(this._moduleOrder); - + + // Calculate the number of items per class. Used so we don't have long lists with only a few items in each row const tmp = sortedModules.map((v, i) => v['class']).reduce((count, cls) => { count[cls] = ++count[cls] || 1; return count; }, {}); const itemsPerClass = Math.max.apply(null, Object.keys(tmp).map(key => tmp[key])); let itemsOnThisRow = 0; - for (let i = 0; i < sortedModules.length; i++) { let m = sortedModules[i]; let mount = null; @@ -248,8 +256,23 @@ export default class AvailableModulesMenu extends TranslatedComponent { let eventHandlers; if (disabled || active) { - eventHandlers = {}; + /** + * ToDo: possibly create an "activeSlotId" variable to allow + * focus to be set on active slot when slot menu is opened + */ + eventHandlers = { + onKeyDown: this._keyDown.bind(this, null), + onKeyUp: this._keyUp.bind(this, null) + + }; } else { + /** + * Get the ids of the first and last
  • elements in the