import React from 'react'; import PropTypes from 'prop-types'; import cn from 'classnames'; import TranslatedComponent from './TranslatedComponent'; import PowerBands from './PowerBands'; import { slotName, slotComparator } from '../utils/SlotFunctions'; import { Power, NoPower } from './SvgIcons'; const POWER = [ null, null, , ]; /** * Power Management Section */ export default class PowerManagement extends TranslatedComponent { static propTypes = { ship: PropTypes.object.isRequired, code: PropTypes.string.isRequired, onChange: PropTypes.func.isRequired }; /** * Constructor * @param {Object} props React Component properties */ constructor(props) { super(props); this._renderPowerRows = this._renderPowerRows.bind(this); this._updateWidth = this._updateWidth.bind(this); this._sort = this._sort.bind(this); this.state = { predicate: 'pwr', desc: false, width: 0 }; } /** * Set the sort order and sort * @param {string} predicate Sort predicate */ _sortOrder(predicate) { let desc = this.state.desc; if (predicate == this.state.predicate) { desc = !desc; } else { desc = true; } this._sort(this.props.ship, predicate, desc); this.setState({ predicate, desc }); } /** * Sorts the power list * @param {Ship} ship Ship instance * @param {string} predicate Sort predicate * @param {Boolean} desc Sort order descending */ _sort(ship, predicate, desc) { let powerList = ship.powerList; let comp = slotComparator.bind(null, this.context.language.translate); switch (predicate) { case 'n': comp = comp(null, desc); break; case 't': comp = comp((a, b) => a.type.localeCompare(b.type), desc); break; case 'pri': comp = comp((a, b) => a.priority - b.priority, desc); break; case 'pwr': comp = comp((a, b) => a.m.getPowerUsage() - b.m.getPowerUsage(), desc); break; case 'r': comp = comp((a, b) => ship.getSlotStatus(a) - ship.getSlotStatus(b), desc); break; case 'd': comp = comp((a, b) => ship.getSlotStatus(a, true) - ship.getSlotStatus(b, true), desc); break; } powerList.sort(comp); } /** * Update slot priority * @param {Object} slot Slot model * @param {number} inc increment / decrement */ _priority(slot, inc) { if (this.props.ship.setSlotPriority(slot, slot.priority + inc)) { this.props.onChange(); } } /** * Toggle slot active/inactive * @param {Object} slot Slot model */ _toggleEnabled(slot) { this.props.ship.setSlotEnabled(slot, !slot.enabled); this.props.onChange(); } /** * Generate/Render table rows * @param {Ship} ship Ship instance * @param {Function} translate Translate function * @param {Function} pwr Localized Power formatter * @param {Function} pct Localized Percent formatter * @return {Array} Array of React.Component table rows */ _renderPowerRows(ship, translate, pwr, pct) { let powerRows = []; for (let i = 0, l = ship.powerList.length; i < l; i++) { let slot = ship.powerList[i]; if (slot.m && slot.m.getPowerUsage() > 0) { let m = slot.m; let toggleEnabled = this._toggleEnabled.bind(this, slot); let retractedElem = null, deployedElem = null; if (slot.enabled) { retractedElem = {POWER[ship.getSlotStatus(slot, false)]}; deployedElem = {POWER[ship.getSlotStatus(slot, true)]}; } else { retractedElem = {translate('disabled')}; } powerRows.push( {m.class + m.rating} {slotName(translate, slot)} {translate(slot.type)} {' ' + (slot.priority + 1) + ' '} {pwr(m.getPowerUsage())} {pct(m.getPowerUsage() / ship.powerAvailable)} {retractedElem} {deployedElem} ); } } return powerRows; } /** * Update power bands width from DOM */ _updateWidth() { this.setState({ width: this.node.offsetWidth }); } /** * Add listeners when about to mount and sort power list */ componentWillMount() { this._sort(this.props.ship, this.state.predicate, this.state.desc); this.resizeListener = this.context.onWindowResize(this._updateWidth); } /** * Trigger DOM updates on mount */ componentDidMount() { this._updateWidth(); } /** * Sort power list if the ship instance has changed * @param {Object} nextProps Incoming/Next properties * @param {Object} nextState Incoming/Next state */ componentWillUpdate(nextProps, nextState) { if (this.props.ship != nextProps.ship) { this._sort(nextProps.ship, nextState.predicate, nextState.desc); } } /** * Remove listeners on unmount */ componentWillUnmount() { this.resizeListener.remove(); } /** * Render power management section * @return {React.Component} contents */ render() { let { ship, code } = this.props; let { translate, formats } = this.context.language; let pwr = formats.f2; let pp = ship.standard[0].m; let sortOrder = this._sortOrder; return (
this.node = node} className='group half' id='componentPriority'> {this._renderPowerRows(ship, translate, pwr, formats.pct1)}
{translate('module')} {translate('type')} {translate('pri')} {translate('PWR')} {translate('ret')} {translate('dep')}
{pp.class + pp.rating} {translate('pp')} {translate('SYS')} 1 {pwr(pp.getPowerGeneration())} 100%

); } }