diff --git a/src/app/components/AvailableModulesMenu.jsx b/src/app/components/AvailableModulesMenu.jsx index b3fda06f..6b8faed6 100644 --- a/src/app/components/AvailableModulesMenu.jsx +++ b/src/app/components/AvailableModulesMenu.jsx @@ -128,6 +128,7 @@ export default class AvailableModulesMenu extends TranslatedComponent { m: PropTypes.object, shipMass: PropTypes.number, warning: PropTypes.func, + disable: PropTypes.func, firstSlotId: PropTypes.string, lastSlotId: PropTypes.string, activeSlotId: PropTypes.string, @@ -159,7 +160,7 @@ export default class AvailableModulesMenu extends TranslatedComponent { */ _initState(props, context) { let translate = context.language.translate; - let { m, warning, shipMass, onSelect, modules, firstSlotId, lastSlotId } = props; + let { m, warning, disable, shipMass, onSelect, modules, firstSlotId, lastSlotId } = props; let list, currentGroup; let buildGroup = this._buildGroup.bind( @@ -167,6 +168,7 @@ export default class AvailableModulesMenu extends TranslatedComponent { translate, m, warning, + disable, shipMass - (m && m.mass ? m.mass : 0), (m, event) => { this._hideDiff(event); @@ -258,6 +260,7 @@ export default class AvailableModulesMenu extends TranslatedComponent { * @param {Function} translate Translate function * @param {Object} mountedModule Mounted Module * @param {Function} warningFunc Warning function + * @param {Function} disableFunc Function when selection should be disabled * @param {number} mass Mass * @param {function} onSelect Select/Mount callback * @param {string} grp Group name @@ -266,7 +269,7 @@ export default class AvailableModulesMenu extends TranslatedComponent { * @param {string} lastSlotId id of last slot item * @return {React.Component} Available Module Group contents */ - _buildGroup(translate, mountedModule, warningFunc, mass, onSelect, grp, modules, firstSlotId, lastSlotId) { + _buildGroup(translate, mountedModule, warningFunc, disableFunc, mass, onSelect, grp, modules, firstSlotId, lastSlotId) { let prevClass = null, prevRating = null, prevName; let elems = []; @@ -284,6 +287,7 @@ export default class AvailableModulesMenu extends TranslatedComponent { let m = sortedModules[i]; let mount = null; let disabled = false; + let softDisabled = disableFunc && disableFunc(m); prevName = m.name; if (ModuleUtils.isShieldGenerator(m.grp)) { // Shield generators care about maximum hull mass @@ -294,7 +298,7 @@ export default class AvailableModulesMenu extends TranslatedComponent { } let active = mountedModule && mountedModule.id === m.id; let classes = cn(m.name ? 'lc' : 'c', { - warning: !disabled && warningFunc && warningFunc(m), + warning: !disabled && (softDisabled || (warningFunc && warningFunc(m))), active, disabled }); @@ -316,7 +320,7 @@ export default class AvailableModulesMenu extends TranslatedComponent { this.lastSlotId = sortedModules[i].id; let showDiff = this._showDiff.bind(this, mountedModule, m); - let select = onSelect.bind(null, m); + let select = softDisabled ? () => {} : onSelect.bind(null, m); eventHandlers = { onMouseEnter: this._over.bind(this, showDiff), @@ -344,7 +348,7 @@ export default class AvailableModulesMenu extends TranslatedComponent { // elems.push(
); itemsOnThisRow = 0; } - if (itemsOnThisRow == 6 || i > 0 && sortedModules.length > 3 && itemsPerClass > 2 && m.class != prevClass && (m.rating != prevRating || m.mount)) { + if (itemsOnThisRow == 4 || i > 0 && sortedModules.length > 3 && itemsPerClass > 2 && m.class != prevClass && (m.rating != prevRating || m.mount)) { elems.push(
); itemsOnThisRow = 0; } diff --git a/src/app/components/Slot.jsx b/src/app/components/Slot.jsx index 8bd080ec..d083449e 100644 --- a/src/app/components/Slot.jsx +++ b/src/app/components/Slot.jsx @@ -7,6 +7,20 @@ import ModificationsMenu from './ModificationsMenu'; import { diffDetails } from '../utils/SlotFunctions'; import { wrapCtxMenu } from '../utils/UtilityFunctions'; +/** + * Returns a function that checks that a given module does not exceed the limit + * of experimental modules. + * @param {Ship} ship Ship to check experimentals for + * @return {Function} Checker function that returns true if the number of + * experimentals is exceeded + */ +function experimentalTracker(ship) { + return (m) => { + return m.experimental && + 4 <= ship.hardpoints.reduce((r, o) => o.m && o.m.experimental ? r + 1 : r, 0); + }; +} + /** * Abstract Slot */ @@ -133,6 +147,7 @@ export default class Slot extends TranslatedComponent { warning={warning} diffDetails={diffDetails.bind(ship, this.context.language)} slotDiv = {this.slotDiv} + disable={experimentalTracker(ship)} />; } }