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)}
/>;
}
}