Even more conversion

This commit is contained in:
Olivier Gagnon 2021-08-28 03:31:47 -04:00
parent 94ad7ccf4b
commit 0de3deee3f
2 changed files with 240 additions and 220 deletions

@ -20,7 +20,12 @@ export class Industry extends BaseReactComponent {
return ( return (
<div> <div>
<div className={"cmpy-mgmt-industry-left-panel"}> <div className={"cmpy-mgmt-industry-left-panel"}>
<IndustryOverview {...this.props} /> <IndustryOverview
routing={this.props.routing}
eventHandler={this.props.eventHandler}
corp={this.props.corp}
currentCity={this.props.currentCity}
/>
<IndustryOffice {...this.props} /> <IndustryOffice {...this.props} />
</div> </div>

@ -1,120 +1,136 @@
// React Component for displaying an Industry's OfficeSpace information // React Component for displaying an Industry's OfficeSpace information
// (bottom-left panel in the Industry UI) // (bottom-left panel in the Industry UI)
import React from "react"; import React, { useState } from "react";
import { BaseReactComponent } from "./BaseReactComponent";
import { OfficeSpace } from "../OfficeSpace"; import { OfficeSpace } from "../OfficeSpace";
import { Employee } from "../Employee";
import { EmployeePositions } from "../EmployeePositions"; import { EmployeePositions } from "../EmployeePositions";
import { numeralWrapper } from "../../ui/numeralFormat"; import { numeralWrapper } from "../../ui/numeralFormat";
import { getSelectText } from "../../../utils/uiHelpers/getSelectData"; import { getSelectText } from "../../../utils/uiHelpers/getSelectData";
export class IndustryOffice extends BaseReactComponent { interface IProps {
constructor(props) { routing: any;
super(props); eventHandler: any;
corp: any;
currentCity: string;
}
this.state = { export function IndustryOffice(props: IProps): React.ReactElement {
city: "", const [employeeManualAssignMode, setEmployeeManualAssignMode] = useState(false);
division: "", const [city, setCity] = useState("");
employeeManualAssignMode: false, const [divisionName, setDivisionName] = useState("");
employee: null, // Reference to employee being referenced if in Manual Mode const [employee, setEmployee] = useState<Employee | null>(null);
numEmployees: 0, const [numEmployees, setNumEmployees] = useState(0);
numOperations: 0, const [numOperations, setNumOperations] = useState(0);
numEngineers: 0, const [numEngineers, setNumEngineers] = useState(0);
numBusiness: 0, const [numBusiness, setNumBusiness] = useState(0);
numManagement: 0, const [numManagement, setNumManagement] = useState(0);
numResearch: 0, const [numResearch, setNumResearch] = useState(0);
numUnassigned: 0, const [numUnassigned, setNumUnassigned] = useState(0);
numTraining: 0, const [numTraining, setNumTraining] = useState(0);
}
this.updateEmployeeCount(); // This function validates division and office refs function resetEmployeeCount() {
setNumEmployees(0);
setNumOperations(0);
setNumEngineers(0);
setNumBusiness(0);
setNumManagement(0);
setNumResearch(0);
setNumUnassigned(0);
setNumTraining(0);
} }
resetEmployeeCount() { function updateEmployeeCount() {
this.state.numEmployees = 0; const division = props.routing.currentDivision;
this.state.numOperations = 0;
this.state.numEngineers = 0;
this.state.numBusiness = 0;
this.state.numManagement = 0;
this.state.numResearch = 0;
this.state.numUnassigned = 0;
this.state.numTraining = 0;
}
updateEmployeeCount() {
const division = this.routing().currentDivision;
if (division == null) { if (division == null) {
throw new Error(`Routing does not hold reference to the current Industry`); throw new Error(`Routing does not hold reference to the current Industry`);
} }
const office = division.offices[this.props.currentCity]; const office = division.offices[props.currentCity];
if (!(office instanceof OfficeSpace)) { if (!(office instanceof OfficeSpace)) {
throw new Error(`Current City (${this.props.currentCity}) for UI does not have an OfficeSpace object`); throw new Error(`Current City (${props.currentCity}) for UI does not have an OfficeSpace object`);
} }
// If we're in a new city, we have to reset the state // If we're in a new city, we have to reset the state
if (division.name !== this.state.division || this.props.currentCity !== this.state.city) { if (division.name !== divisionName || props.currentCity !== city) {
this.resetEmployeeCount(); resetEmployeeCount();
this.state.division = division.name; setDivisionName(division.name);
this.state.city = this.props.currentCity; setCity(props.currentCity);
} }
// Calculate how many NEW emplyoees we need to account for // Calculate how many NEW employees we need to account for
const currentNumEmployees = office.employees.length; const currentNumEmployees = office.employees.length;
let newOperations = numOperations;
let newEngineers = numEngineers;
let newBusiness = numBusiness;
let newManagement = numManagement;
let newResearch = numResearch;
let newUnassigned = numUnassigned;
let newTraining = numTraining;
// Record the number of employees in each position, for NEW employees only // Record the number of employees in each position, for NEW employees only
for (let i = this.state.numEmployees; i < office.employees.length; ++i) { for (let i = numEmployees; i < office.employees.length; ++i) {
switch (office.employees[i].pos) { switch (office.employees[i].pos) {
case EmployeePositions.Operations: case EmployeePositions.Operations:
++this.state.numOperations; newOperations++;
break; break;
case EmployeePositions.Engineer: case EmployeePositions.Engineer:
++this.state.numEngineers; newEngineers++;
break; break;
case EmployeePositions.Business: case EmployeePositions.Business:
++this.state.numBusiness; newBusiness++;
break; break;
case EmployeePositions.Management: case EmployeePositions.Management:
++this.state.numManagement; newManagement++;
break; break;
case EmployeePositions.RandD: case EmployeePositions.RandD:
++this.state.numResearch; newResearch++;
break; break;
case EmployeePositions.Unassigned: case EmployeePositions.Unassigned:
++this.state.numUnassigned; newUnassigned++;
break; break;
case EmployeePositions.Training: case EmployeePositions.Training:
++this.state.numTraining; newTraining++;
break; break;
default: default:
console.error("Unrecognized employee position: " + office.employees[i].pos); console.error("Unrecognized employee position: " + office.employees[i].pos);
break; break;
} }
} }
if(newOperations !== numOperations) setNumOperations(newOperations);
if(newEngineers !== numEngineers) setNumEngineers(newEngineers);
if(newBusiness !== numBusiness) setNumBusiness(newBusiness);
if(newManagement !== numManagement) setNumManagement(newManagement);
if(newResearch !== numResearch) setNumResearch(newResearch);
if(newUnassigned !== numUnassigned) setNumUnassigned(newUnassigned);
if(newTraining !== numTraining) setNumTraining(newTraining);
this.state.numEmployees = currentNumEmployees; if(currentNumEmployees !== numEmployees) setNumEmployees(currentNumEmployees);
} }
// Renders the "Employee Management" section of the Office UI updateEmployeeCount();
renderEmployeeManagement() {
this.updateEmployeeCount();
if (this.state.employeeManualAssignMode) { // Renders the "Employee Management" section of the Office UI
return this.renderManualEmployeeManagement(); function renderEmployeeManagement() {
updateEmployeeCount();
if (employeeManualAssignMode) {
return renderManualEmployeeManagement();
} else { } else {
return this.renderAutomaticEmployeeManagement(); return renderAutomaticEmployeeManagement();
} }
} }
renderAutomaticEmployeeManagement() { function renderAutomaticEmployeeManagement() {
const division = this.routing().currentDivision; // Validated in constructor const division = props.routing.currentDivision; // Validated in constructor
const office = division.offices[this.props.currentCity]; // Validated in constructor const office = division.offices[props.currentCity]; // Validated in constructor
const vechain = (this.corp().unlockUpgrades[4] === 1); // Has Vechain upgrade const vechain = (props.corp.unlockUpgrades[4] === 1); // Has Vechain upgrade
const switchModeOnClick = () => { const switchModeOnClick = () => {
this.state.employeeManualAssignMode = true; setEmployeeManualAssignMode(true);
this.corp().rerender(); props.corp.rerender();
} }
// Calculate average morale, happiness, and energy. Also salary // Calculate average morale, happiness, and energy. Also salary
@ -135,87 +151,87 @@ export class IndustryOffice extends BaseReactComponent {
} }
// Helper functions for (re-)assigning employees to different positions // Helper functions for (re-)assigning employees to different positions
const assignEmployee = (to) => { function assignEmployee(to: string) {
if (this.state.numUnassigned <= 0) { if (numUnassigned <= 0) {
console.warn("Cannot assign employee. No unassigned employees available"); console.warn("Cannot assign employee. No unassigned employees available");
return; return;
} }
switch (to) { switch (to) {
case EmployeePositions.Operations: case EmployeePositions.Operations:
++this.state.numOperations; setNumOperations(n => n+1);
break; break;
case EmployeePositions.Engineer: case EmployeePositions.Engineer:
++this.state.numEngineers; setNumEngineers(n => n+1);
break; break;
case EmployeePositions.Business: case EmployeePositions.Business:
++this.state.numBusiness; setNumBusiness(n => n+1);
break; break;
case EmployeePositions.Management: case EmployeePositions.Management:
++this.state.numManagement; setNumManagement(n => n+1);
break; break;
case EmployeePositions.RandD: case EmployeePositions.RandD:
++this.state.numResearch; setNumResearch(n => n+1);
break; break;
case EmployeePositions.Unassigned: case EmployeePositions.Unassigned:
++this.state.numUnassigned; setNumUnassigned(n => n+1);
break; break;
case EmployeePositions.Training: case EmployeePositions.Training:
++this.state.numTraining; setNumTraining(n => n+1);
break; break;
default: default:
console.error("Unrecognized employee position: " + to); console.error("Unrecognized employee position: " + to);
break; break;
} }
--this.state.numUnassigned; setNumUnassigned(n => n-1);
office.assignEmployeeToJob(to); office.assignEmployeeToJob(to);
office.calculateEmployeeProductivity({ corporation: this.corp(), industry:division }); office.calculateEmployeeProductivity({ corporation: props.corp, industry:division });
this.corp().rerender(); props.corp.rerender();
} }
const unassignEmployee = (from) => { function unassignEmployee(from: string) {
function logWarning(pos) { function logWarning(pos: string) {
console.warn(`Cannot unassign from ${pos} because there is nobody assigned to that position`); console.warn(`Cannot unassign from ${pos} because there is nobody assigned to that position`);
} }
switch (from) { switch (from) {
case EmployeePositions.Operations: case EmployeePositions.Operations:
if (this.state.numOperations <= 0) { return logWarning(EmployeePositions.Operations); } if (numOperations <= 0) { return logWarning(EmployeePositions.Operations); }
--this.state.numOperations; setNumOperations(n => n-1);
break; break;
case EmployeePositions.Engineer: case EmployeePositions.Engineer:
if (this.state.numEngineers <= 0) { return logWarning(EmployeePositions.Operations); } if (numEngineers <= 0) { return logWarning(EmployeePositions.Operations); }
--this.state.numEngineers; setNumEngineers(n => n-1);
break; break;
case EmployeePositions.Business: case EmployeePositions.Business:
if (this.state.numBusiness <= 0) { return logWarning(EmployeePositions.Operations); } if (numBusiness <= 0) { return logWarning(EmployeePositions.Operations); }
--this.state.numBusiness; setNumBusiness(n => n-1);
break; break;
case EmployeePositions.Management: case EmployeePositions.Management:
if (this.state.numManagement <= 0) { return logWarning(EmployeePositions.Operations); } if (numManagement <= 0) { return logWarning(EmployeePositions.Operations); }
--this.state.numManagement; setNumManagement(n => n-1);
break; break;
case EmployeePositions.RandD: case EmployeePositions.RandD:
if (this.state.numResearch <= 0) { return logWarning(EmployeePositions.Operations); } if (numResearch <= 0) { return logWarning(EmployeePositions.Operations); }
--this.state.numResearch; setNumResearch(n => n-1);
break; break;
case EmployeePositions.Unassigned: case EmployeePositions.Unassigned:
console.warn(`Tried to unassign from the Unassigned position`); console.warn(`Tried to unassign from the Unassigned position`);
break; break;
case EmployeePositions.Training: case EmployeePositions.Training:
if (this.state.numTraining <= 0) { return logWarning(EmployeePositions.Operations); } if (numTraining <= 0) { return logWarning(EmployeePositions.Operations); }
--this.state.numTraining; setNumTraining(n => n-1);
break; break;
default: default:
console.error("Unrecognized employee position: " + from); console.error("Unrecognized employee position: " + from);
break; break;
} }
++this.state.numUnassigned; setNumUnassigned(n => n+1);
office.unassignEmployeeFromJob(from); office.unassignEmployeeFromJob(from);
office.calculateEmployeeProductivity({ corporation: this.corp(), industry:division }); office.calculateEmployeeProductivity({ corporation: props.corp, industry:division });
this.corp().rerender(); props.corp.rerender();
} }
const positionHeaderStyle = { const positionHeaderStyle = {
@ -223,67 +239,67 @@ export class IndustryOffice extends BaseReactComponent {
margin: "5px 0px 5px 0px", margin: "5px 0px 5px 0px",
width: "50%", width: "50%",
} }
const assignButtonClass = this.state.numUnassigned > 0 ? "std-button" : "a-link-button-inactive"; const assignButtonClass = numUnassigned > 0 ? "std-button" : "a-link-button-inactive";
const operationAssignButtonOnClick = () => { const operationAssignButtonOnClick = () => {
assignEmployee(EmployeePositions.Operations); assignEmployee(EmployeePositions.Operations);
this.corp().rerender(); props.corp.rerender();
} }
const operationUnassignButtonOnClick = () => { const operationUnassignButtonOnClick = () => {
unassignEmployee(EmployeePositions.Operations); unassignEmployee(EmployeePositions.Operations);
this.corp().rerender(); props.corp.rerender();
} }
const operationUnassignButtonClass = this.state.numOperations > 0 ? "std-button" : "a-link-button-inactive"; const operationUnassignButtonClass = numOperations > 0 ? "std-button" : "a-link-button-inactive";
const engineerAssignButtonOnClick = () => { const engineerAssignButtonOnClick = () => {
assignEmployee(EmployeePositions.Engineer); assignEmployee(EmployeePositions.Engineer);
this.corp().rerender(); props.corp.rerender();
} }
const engineerUnassignButtonOnClick = () => { const engineerUnassignButtonOnClick = () => {
unassignEmployee(EmployeePositions.Engineer); unassignEmployee(EmployeePositions.Engineer);
this.corp().rerender(); props.corp.rerender();
} }
const engineerUnassignButtonClass = this.state.numEngineers > 0 ? "std-button" : "a-link-button-inactive"; const engineerUnassignButtonClass = numEngineers > 0 ? "std-button" : "a-link-button-inactive";
const businessAssignButtonOnClick = () => { const businessAssignButtonOnClick = () => {
assignEmployee(EmployeePositions.Business); assignEmployee(EmployeePositions.Business);
this.corp().rerender(); props.corp.rerender();
} }
const businessUnassignButtonOnClick = () => { const businessUnassignButtonOnClick = () => {
unassignEmployee(EmployeePositions.Business); unassignEmployee(EmployeePositions.Business);
this.corp().rerender(); props.corp.rerender();
} }
const businessUnassignButtonClass = this.state.numBusiness > 0 ? "std-button" : "a-link-button-inactive"; const businessUnassignButtonClass = numBusiness > 0 ? "std-button" : "a-link-button-inactive";
const managementAssignButtonOnClick = () => { const managementAssignButtonOnClick = () => {
assignEmployee(EmployeePositions.Management); assignEmployee(EmployeePositions.Management);
this.corp().rerender(); props.corp.rerender();
} }
const managementUnassignButtonOnClick = () => { const managementUnassignButtonOnClick = () => {
unassignEmployee(EmployeePositions.Management); unassignEmployee(EmployeePositions.Management);
this.corp().rerender(); props.corp.rerender();
} }
const managementUnassignButtonClass = this.state.numManagement > 0 ? "std-button" : "a-link-button-inactive"; const managementUnassignButtonClass = numManagement > 0 ? "std-button" : "a-link-button-inactive";
const rndAssignButtonOnClick = () => { const rndAssignButtonOnClick = () => {
assignEmployee(EmployeePositions.RandD); assignEmployee(EmployeePositions.RandD);
this.corp().rerender(); props.corp.rerender();
} }
const rndUnassignButtonOnClick = () => { const rndUnassignButtonOnClick = () => {
unassignEmployee(EmployeePositions.RandD); unassignEmployee(EmployeePositions.RandD);
this.corp().rerender(); props.corp.rerender();
} }
const rndUnassignButtonClass = this.state.numResearch > 0 ? "std-button" : "a-link-button-inactive"; const rndUnassignButtonClass = numResearch > 0 ? "std-button" : "a-link-button-inactive";
const trainingAssignButtonOnClick = () => { const trainingAssignButtonOnClick = () => {
assignEmployee(EmployeePositions.Training); assignEmployee(EmployeePositions.Training);
this.corp().rerender(); props.corp.rerender();
} }
const trainingUnassignButtonOnClick = () => { const trainingUnassignButtonOnClick = () => {
unassignEmployee(EmployeePositions.Training); unassignEmployee(EmployeePositions.Training);
this.corp().rerender(); props.corp.rerender();
} }
const trainingUnassignButtonClass = this.state.numTraining > 0 ? "std-button" : "a-link-button-inactive"; const trainingUnassignButtonClass = numTraining > 0 ? "std-button" : "a-link-button-inactive";
return ( return (
<div> <div>
@ -295,7 +311,7 @@ export class IndustryOffice extends BaseReactComponent {
</span> </span>
</button> </button>
<p><strong>Unassigned Employees: {this.state.numUnassigned}</strong></p> <p><strong>Unassigned Employees: {numUnassigned}</strong></p>
<br /> <br />
<p>Avg Employee Morale: {numeralWrapper.format(avgMorale, "0.000")}</p> <p>Avg Employee Morale: {numeralWrapper.format(avgMorale, "0.000")}</p>
@ -344,7 +360,7 @@ export class IndustryOffice extends BaseReactComponent {
} }
<h2 className={"tooltip"} style={positionHeaderStyle}> <h2 className={"tooltip"} style={positionHeaderStyle}>
{EmployeePositions.Operations} ({this.state.numOperations}) {EmployeePositions.Operations} ({numOperations})
<span className={"tooltiptext"}> <span className={"tooltiptext"}>
Manages supply chain operations. Improves the amount of Materials and Products you produce. Manages supply chain operations. Improves the amount of Materials and Products you produce.
</span> </span>
@ -354,7 +370,7 @@ export class IndustryOffice extends BaseReactComponent {
<br /> <br />
<h2 className={"tooltip"} style={positionHeaderStyle}> <h2 className={"tooltip"} style={positionHeaderStyle}>
{EmployeePositions.Engineer} ({this.state.numEngineers}) {EmployeePositions.Engineer} ({numEngineers})
<span className={"tooltiptext"}> <span className={"tooltiptext"}>
Develops and maintains products and production systems. Increases the quality of Develops and maintains products and production systems. Increases the quality of
everything you produce. Also increases the amount you produce (not as much everything you produce. Also increases the amount you produce (not as much
@ -366,7 +382,7 @@ export class IndustryOffice extends BaseReactComponent {
<br /> <br />
<h2 className={"tooltip"} style={positionHeaderStyle}> <h2 className={"tooltip"} style={positionHeaderStyle}>
{EmployeePositions.Business} ({this.state.numBusiness}) {EmployeePositions.Business} ({numBusiness})
<span className={"tooltiptext"}> <span className={"tooltiptext"}>
Handles sales and finances. Improves the amount of Materials and Products you can sell. Handles sales and finances. Improves the amount of Materials and Products you can sell.
</span> </span>
@ -376,7 +392,7 @@ export class IndustryOffice extends BaseReactComponent {
<br /> <br />
<h2 className={"tooltip"} style={positionHeaderStyle}> <h2 className={"tooltip"} style={positionHeaderStyle}>
{EmployeePositions.Management} ({this.state.numManagement}) {EmployeePositions.Management} ({numManagement})
<span className={"tooltiptext"}> <span className={"tooltiptext"}>
Leads and oversees employees and office operations. Improves the effectiveness of Leads and oversees employees and office operations. Improves the effectiveness of
Engineer and Operations employees Engineer and Operations employees
@ -387,7 +403,7 @@ export class IndustryOffice extends BaseReactComponent {
<br /> <br />
<h2 className={"tooltip"} style={positionHeaderStyle}> <h2 className={"tooltip"} style={positionHeaderStyle}>
{EmployeePositions.RandD} ({this.state.numResearch}) {EmployeePositions.RandD} ({numResearch})
<span className={"tooltiptext"}> <span className={"tooltiptext"}>
Research new innovative ways to improve the company. Generates Scientific Research Research new innovative ways to improve the company. Generates Scientific Research
</span> </span>
@ -397,7 +413,7 @@ export class IndustryOffice extends BaseReactComponent {
<br /> <br />
<h2 className={"tooltip"} style={positionHeaderStyle}> <h2 className={"tooltip"} style={positionHeaderStyle}>
{EmployeePositions.Training} ({this.state.numTraining}) {EmployeePositions.Training} ({numTraining})
<span className={"tooltiptext"}> <span className={"tooltiptext"}>
Set employee to training, which will increase some of their stats. Employees in training do not affect any company operations. Set employee to training, which will increase some of their stats. Employees in training do not affect any company operations.
</span> </span>
@ -408,14 +424,14 @@ export class IndustryOffice extends BaseReactComponent {
) )
} }
renderManualEmployeeManagement() { function renderManualEmployeeManagement() {
const corp = this.corp(); const corp = props.corp;
const division = this.routing().currentDivision; // Validated in constructor const division = props.routing.currentDivision; // Validated in constructor
const office = division.offices[this.props.currentCity]; // Validated in constructor const office = division.offices[props.currentCity]; // Validated in constructor
const switchModeOnClick = () => { const switchModeOnClick = () => {
this.state.employeeManualAssignMode = false; setEmployeeManualAssignMode(false);
this.corp().rerender(); props.corp.rerender();
} }
const employeeInfoDivStyle = { const employeeInfoDivStyle = {
@ -430,11 +446,11 @@ export class IndustryOffice extends BaseReactComponent {
employees.push(<option key={office.employees[i].name}>{office.employees[i].name}</option>) employees.push(<option key={office.employees[i].name}>{office.employees[i].name}</option>)
} }
const employeeSelectorOnChange = (e) => { const employeeSelectorOnChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
const name = getSelectText(e.target); const name = getSelectText(e.target);
for (let i = 0; i < office.employees.length; ++i) { for (let i = 0; i < office.employees.length; ++i) {
if (name === office.employees[i].name) { if (name === office.employees[i].name) {
this.state.employee = office.employees[i]; setEmployee(office.employees[i]);
break; break;
} }
} }
@ -443,8 +459,8 @@ export class IndustryOffice extends BaseReactComponent {
} }
// Employee Positions Selector // Employee Positions Selector
const emp = this.state.employee; const emp = employee;
let employeePositionSelectorInitialValue = null; let employeePositionSelectorInitialValue = "";
const employeePositions = []; const employeePositions = [];
const positionNames = Object.values(EmployeePositions); const positionNames = Object.values(EmployeePositions);
for (let i = 0; i < positionNames.length; ++i) { for (let i = 0; i < positionNames.length; ++i) {
@ -454,10 +470,11 @@ export class IndustryOffice extends BaseReactComponent {
} }
} }
const employeePositionSelectorOnChange = (e) => { function employeePositionSelectorOnChange(e: React.ChangeEvent<HTMLSelectElement>) {
if(employee === null) return;
const pos = getSelectText(e.target); const pos = getSelectText(e.target);
this.state.employee.pos = pos; employee.pos = pos;
this.resetEmployeeCount(); resetEmployeeCount();
corp.rerender(); corp.rerender();
} }
@ -486,29 +503,29 @@ export class IndustryOffice extends BaseReactComponent {
{employees} {employees}
</select> </select>
{ {
this.state.employee != null && employee != null &&
<p> <p>
Morale: {numeralWrapper.format(this.state.employee.mor, nf)} Morale: {numeralWrapper.format(employee.mor, nf)}
<br /> <br />
Happiness: {numeralWrapper.format(this.state.employee.hap, nf)} Happiness: {numeralWrapper.format(employee.hap, nf)}
<br /> <br />
Energy: {numeralWrapper.format(this.state.employee.ene, nf)} Energy: {numeralWrapper.format(employee.ene, nf)}
<br /> <br />
Intelligence: {numeralWrapper.format(effInt, nf)} Intelligence: {numeralWrapper.format(effInt, nf)}
<br /> <br />
Charisma: {numeralWrapper.format(effCha, nf)} Charisma: {numeralWrapper.format(effCha, nf)}
<br /> <br />
Experience: {numeralWrapper.format(this.state.employee.exp, nf)} Experience: {numeralWrapper.format(employee.exp, nf)}
<br /> <br />
Creativity: {numeralWrapper.format(effCre, nf)} Creativity: {numeralWrapper.format(effCre, nf)}
<br /> <br />
Efficiency: {numeralWrapper.format(effEff, nf)} Efficiency: {numeralWrapper.format(effEff, nf)}
<br /> <br />
Salary: {numeralWrapper.formatMoney(this.state.employee.sal)} Salary: {numeralWrapper.formatMoney(employee.sal)}
</p> </p>
} }
{ {
this.state.employee != null && employee != null &&
<select onChange={employeePositionSelectorOnChange} value={employeePositionSelectorInitialValue}> <select onChange={employeePositionSelectorOnChange} value={employeePositionSelectorInitialValue}>
{employeePositions} {employeePositions}
</select> </select>
@ -518,89 +535,87 @@ export class IndustryOffice extends BaseReactComponent {
) )
} }
render() { const corp = props.corp;
const corp = this.corp(); const division = props.routing.currentDivision; // Validated in constructor
const division = this.routing().currentDivision; // Validated in constructor const office = division.offices[props.currentCity]; // Validated in constructor
const office = division.offices[this.props.currentCity]; // Validated in constructor
const buttonStyle = { const buttonStyle = {
fontSize: "13px", fontSize: "13px",
}
// Hire Employee button
let hireEmployeeButtonClass = "tooltip";
if (office.atCapacity()) {
hireEmployeeButtonClass += " a-link-button-inactive";
} else {
hireEmployeeButtonClass += " std-button";
if (office.employees.length === 0) {
hireEmployeeButtonClass += " flashing-button";
}
}
const hireEmployeeButtonOnClick = () => {
office.findEmployees({ corporation: corp, industry: division });
}
// Autohire employee button
let autohireEmployeeButtonClass = "tooltip";
if (office.atCapacity()) {
autohireEmployeeButtonClass += " a-link-button-inactive";
} else {
autohireEmployeeButtonClass += " std-button";
}
const autohireEmployeeButtonOnClick = () => {
if (office.atCapacity()) { return; }
office.hireRandomEmployee();
this.corp().rerender();
}
// Upgrade Office Size Button
const upgradeOfficeSizeOnClick = this.eventHandler().createUpgradeOfficeSizePopup.bind(this.eventHandler(), office);
// Throw Office Party
const throwOfficePartyOnClick = this.eventHandler().createThrowOfficePartyPopup.bind(this.eventHandler(), office);
return (
<div className={"cmpy-mgmt-employee-panel"}>
<h1 style={{ margin: "4px 0px 5px 0px" }}>Office Space</h1>
<p>Size: {office.employees.length} / {office.size} employees</p>
<button className={hireEmployeeButtonClass} onClick={hireEmployeeButtonOnClick} style={buttonStyle}>
Hire Employee
{
office.employees.length === 0 &&
<span className={"tooltiptext"}>
You'll need to hire some employees to get your operations started!
It's recommended to have at least one employee in every position
</span>
}
</button>
<button className={autohireEmployeeButtonClass} onClick={autohireEmployeeButtonOnClick} style={buttonStyle}>
Autohire Employee
<span className={"tooltiptext"}>
Automatically hires an employee and gives him/her a random name
</span>
</button>
<br />
<button className={"std-button tooltip"} onClick={upgradeOfficeSizeOnClick} style={buttonStyle}>
Upgrade size
<span className={"tooltiptext"}>
Upgrade the office's size so that it can hold more employees!
</span>
</button>
{
!division.hasResearch("AutoPartyManager") &&
<button className={"std-button tooltip"} onClick={throwOfficePartyOnClick} style={buttonStyle}>
Throw Party
<span className={"tooltiptext"}>
"Throw an office party to increase your employee's morale and happiness"
</span>
</button>
}
<br />
{this.renderEmployeeManagement()}
</div>
)
} }
// Hire Employee button
let hireEmployeeButtonClass = "tooltip";
if (office.atCapacity()) {
hireEmployeeButtonClass += " a-link-button-inactive";
} else {
hireEmployeeButtonClass += " std-button";
if (office.employees.length === 0) {
hireEmployeeButtonClass += " flashing-button";
}
}
const hireEmployeeButtonOnClick = () => {
office.findEmployees({ corporation: corp, industry: division });
}
// Autohire employee button
let autohireEmployeeButtonClass = "tooltip";
if (office.atCapacity()) {
autohireEmployeeButtonClass += " a-link-button-inactive";
} else {
autohireEmployeeButtonClass += " std-button";
}
const autohireEmployeeButtonOnClick = () => {
if (office.atCapacity()) { return; }
office.hireRandomEmployee();
props.corp.rerender();
}
// Upgrade Office Size Button
const upgradeOfficeSizeOnClick = props.eventHandler.createUpgradeOfficeSizePopup.bind(props.eventHandler, office);
// Throw Office Party
const throwOfficePartyOnClick = props.eventHandler.createThrowOfficePartyPopup.bind(props.eventHandler, office);
return (
<div className={"cmpy-mgmt-employee-panel"}>
<h1 style={{ margin: "4px 0px 5px 0px" }}>Office Space</h1>
<p>Size: {office.employees.length} / {office.size} employees</p>
<button className={hireEmployeeButtonClass} onClick={hireEmployeeButtonOnClick} style={buttonStyle}>
Hire Employee
{
office.employees.length === 0 &&
<span className={"tooltiptext"}>
You'll need to hire some employees to get your operations started!
It's recommended to have at least one employee in every position
</span>
}
</button>
<button className={autohireEmployeeButtonClass} onClick={autohireEmployeeButtonOnClick} style={buttonStyle}>
Autohire Employee
<span className={"tooltiptext"}>
Automatically hires an employee and gives him/her a random name
</span>
</button>
<br />
<button className={"std-button tooltip"} onClick={upgradeOfficeSizeOnClick} style={buttonStyle}>
Upgrade size
<span className={"tooltiptext"}>
Upgrade the office's size so that it can hold more employees!
</span>
</button>
{
!division.hasResearch("AutoPartyManager") &&
<button className={"std-button tooltip"} onClick={throwOfficePartyOnClick} style={buttonStyle}>
Throw Party
<span className={"tooltiptext"}>
"Throw an office party to increase your employee's morale and happiness"
</span>
</button>
}
<br />
{renderEmployeeManagement()}
</div>
)
} }