mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2025-03-11 04:42:34 +01:00
COMPANY: Show unqualified direct promotion (followup) (#983)
This commit is contained in:
@ -1,29 +1,24 @@
|
||||
import * as React from "react";
|
||||
import type { CompanyPosition } from "../CompanyPosition";
|
||||
import type { Company } from "../Company";
|
||||
|
||||
import { Company } from "../Company";
|
||||
import { CompanyPosition } from "../CompanyPosition";
|
||||
import * as React from "react";
|
||||
|
||||
import { Player } from "@player";
|
||||
import { Typography } from "@mui/material";
|
||||
import { ButtonWithTooltip } from "../../ui/Components/ButtonWithTooltip";
|
||||
import { CompanyPositions } from "../CompanyPositions";
|
||||
import { JobSummary } from "./JobSummary";
|
||||
import { Requirement } from "../../ui/Components/Requirement";
|
||||
import { getJobRequirements } from "../GetJobRequirements";
|
||||
|
||||
interface IProps {
|
||||
interface ApplyToJobProps {
|
||||
company: Company;
|
||||
position: CompanyPosition;
|
||||
currentPosition: CompanyPosition | null;
|
||||
qualified: boolean;
|
||||
}
|
||||
|
||||
/** React Component for a button that's used to apply for a job */
|
||||
export function ApplyToJobButton(props: IProps): React.ReactElement {
|
||||
const underqualified = !Player.isQualified(props.company, props.position);
|
||||
const nextPos = props.position.nextPosition && CompanyPositions[props.position.nextPosition];
|
||||
const overqualified = nextPos != null && Player.isQualified(props.company, nextPos);
|
||||
|
||||
const reqs = getJobRequirements(props.company, props.position);
|
||||
export function ApplyToJobButton({ company, position, qualified }: ApplyToJobProps): React.ReactElement {
|
||||
const reqs = getJobRequirements(company, position);
|
||||
const positionRequirements =
|
||||
reqs.length == 0 ? (
|
||||
<Typography>Accepting all applicants</Typography>
|
||||
@ -38,8 +33,8 @@ export function ApplyToJobButton(props: IProps): React.ReactElement {
|
||||
|
||||
const positionDetails = (
|
||||
<>
|
||||
<JobSummary company={props.company} position={props.position} overqualified={overqualified} />
|
||||
{props.position.isPartTime && (
|
||||
<JobSummary company={company} position={position} />
|
||||
{position.isPartTime && (
|
||||
<Typography>
|
||||
<br />
|
||||
Part-time jobs have no penalty for
|
||||
@ -48,27 +43,21 @@ export function ApplyToJobButton(props: IProps): React.ReactElement {
|
||||
)}
|
||||
<br />
|
||||
{positionRequirements}
|
||||
{overqualified && (
|
||||
<Typography>
|
||||
<br />
|
||||
You are overqualified for this position.
|
||||
</Typography>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
|
||||
function applyForJob(): void {
|
||||
Player.applyForJob(props.company, props.position);
|
||||
Player.applyForJob(company, position);
|
||||
}
|
||||
|
||||
return (
|
||||
<ButtonWithTooltip
|
||||
disabledTooltip={underqualified && positionDetails}
|
||||
disabledTooltip={!qualified && positionDetails}
|
||||
normalTooltip={positionDetails}
|
||||
onClick={applyForJob}
|
||||
tooltipProps={{ style: { display: "grid" } }}
|
||||
>
|
||||
{props.position.applyText}
|
||||
{position.applyText}
|
||||
</ButtonWithTooltip>
|
||||
);
|
||||
}
|
||||
|
@ -7,33 +7,32 @@ import { CompanyPositions } from "../CompanyPositions";
|
||||
import { ApplyToJobButton } from "./ApplyToJobButton";
|
||||
import { Player } from "@player";
|
||||
|
||||
interface IJobListingsProps {
|
||||
interface JobListingsProps {
|
||||
company: Company;
|
||||
currentPosition: CompanyPosition | null;
|
||||
}
|
||||
|
||||
export function JobListings(props: IJobListingsProps): React.ReactElement {
|
||||
const { company, currentPosition } = props;
|
||||
|
||||
export function JobListings({ company, currentPosition }: JobListingsProps): React.ReactElement {
|
||||
const jobNames = [...company.companyPositions];
|
||||
const qualifiedJobs = new Set(jobNames.filter((jobName) => Player.isQualified(company, CompanyPositions[jobName])));
|
||||
const jobsToShow = [];
|
||||
for (const jobName of company.companyPositions) {
|
||||
const offeredPos = CompanyPositions[jobName];
|
||||
const underqualified = !Player.isQualified(props.company, offeredPos);
|
||||
const isCurrentPosition = jobName == props.currentPosition?.name;
|
||||
const nextPos = offeredPos.nextPosition && CompanyPositions[offeredPos.nextPosition];
|
||||
const overqualified = nextPos != null && Player.isQualified(props.company, nextPos);
|
||||
const shouldShowApplyButton =
|
||||
!isCurrentPosition && !overqualified && (!underqualified || offeredPos.requiredReputation == 0);
|
||||
|
||||
if (shouldShowApplyButton) {
|
||||
jobsToShow.push(offeredPos);
|
||||
for (const jobName of jobNames) {
|
||||
if (jobName === currentPosition?.name) continue;
|
||||
const job = CompanyPositions[jobName];
|
||||
const nextJobName = job.nextPosition;
|
||||
// Don't show a job if we already qualify for a later job offered by this company
|
||||
if (nextJobName && qualifiedJobs.has(nextJobName)) continue;
|
||||
// Don't show a job if we don't qualify for it, unless it's a starting job or a promotion from current job
|
||||
if (!qualifiedJobs.has(jobName) && job.requiredReputation > 0 && jobName !== currentPosition?.nextPosition) {
|
||||
continue;
|
||||
}
|
||||
jobsToShow.push(job);
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
{jobsToShow.map((position) => (
|
||||
<ApplyToJobButton key={position.name} company={company} position={position} currentPosition={currentPosition} />
|
||||
{jobsToShow.map((job) => (
|
||||
<ApplyToJobButton key={job.name} company={company} position={job} qualified={qualifiedJobs.has(job.name)} />
|
||||
))}
|
||||
</>
|
||||
);
|
||||
|
@ -1,3 +1,6 @@
|
||||
import type { Company } from "../Company";
|
||||
import type { CompanyPosition } from "../CompanyPosition";
|
||||
|
||||
import { Typography } from "@mui/material";
|
||||
import { Player } from "@player";
|
||||
import * as React from "react";
|
||||
@ -6,22 +9,19 @@ import { calculateCompanyWorkStats } from "../../Work/Formulas";
|
||||
import { MoneyRate } from "../../ui/React/MoneyRate";
|
||||
import { ReputationRate } from "../../ui/React/ReputationRate";
|
||||
import { StatsTable } from "../../ui/React/StatsTable";
|
||||
import type { Company } from "../Company";
|
||||
import type { CompanyPosition } from "../CompanyPosition";
|
||||
|
||||
const CYCLES_PER_SEC = 1000 / CONSTANTS.MilliPerCycle;
|
||||
interface IJobSummaryProps {
|
||||
interface JobSummaryProps {
|
||||
company: Company;
|
||||
position: CompanyPosition;
|
||||
overqualified?: boolean;
|
||||
}
|
||||
|
||||
export function JobSummary(props: IJobSummaryProps): React.ReactElement {
|
||||
const workStats = calculateCompanyWorkStats(Player, props.company, props.position, props.company.favor);
|
||||
export function JobSummary({ company, position }: JobSummaryProps): React.ReactElement {
|
||||
const workStats = calculateCompanyWorkStats(Player, company, position, company.favor);
|
||||
return (
|
||||
<>
|
||||
<Typography>
|
||||
<u>{props.position.name}</u>
|
||||
<u>{position.name}</u>
|
||||
</Typography>
|
||||
<StatsTable
|
||||
wide
|
||||
|
Reference in New Issue
Block a user