| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- import { createGraph, createTable, switchPlot } from "../core";
- import { months, monthsPretty } from "../staticData/constants";
- import { addConfigField, clearChildren, getCompanyId, getData, prettyMonthName } from "../utils";
- import { Graph } from "./graph";
- export class CompanyRank implements Graph {
- id = "compRank";
- displayName = "Company Rank";
- configFieldIDs = ["month", "companyName"];
- loadedData: any;
- urlParams: any;
- constructor(loadedData: any, urlParams: any)
- {
- this.loadedData = loadedData;
- this.urlParams = urlParams;
- }
- setConfigs(useURLParams?: boolean)
- {
- const updateFunc = function() {switchPlot();}
- const configDiv = document.getElementById("selectorSubtypes");
- if(configDiv)
- {
- clearChildren(configDiv);
- }
- configDiv?.appendChild(addConfigField("select", "month", "Month: ", {prettyValues: monthsPretty, "values": months}, useURLParams && this.urlParams.month ? this.urlParams.month : months[months.length - 1], updateFunc));
- configDiv?.appendChild(addConfigField("input", "companyName", "Username: ", undefined, useURLParams ? this.urlParams.companyName : undefined, updateFunc, "-27px"));
-
- }
- async generatePlot(configValues: any, plotContainerID: string)
- {
- if(!configValues.companyName || configValues.companyName == ""){return;}
- // Get Company Data
- const knownCompanies = await getData(this.loadedData, "knownCompanies");
- // Get Company ID
- var companyID = await getCompanyId(configValues.companyName, this.loadedData) as string;
- if(!companyID){ return; }
- var companyName = knownCompanies[companyID];
- // Get Data
- const fullCompanyData = await getData(this.loadedData, "company", configValues.month); // Company data for the current month
- const fullPrevCompanyData = configValues.month == months[0] ? {individual: {}} : await getData(this.loadedData, "company", months[months.indexOf(configValues.month) - 1])
-
- const companyData = fullCompanyData.individual[companyID]; // Company data for this company for this month
- const prevCompanyData = fullPrevCompanyData.individual[companyID]; // Company data for this company for last month. May be undefined.
- if(!companyData){return;}
- var tableData = [] as any[]; // Entries in the table in raw data form
- var tableDisplay = [] as any[]; // Entries in the table in presentable form
- Object.keys(companyData).forEach(ticker => {
- const tableRow = [companyData[ticker].rank, ticker, companyData[ticker].amount, companyData[ticker].volume, companyData[ticker].profit];
- const tableDisplayRow = [] as any[];
- // Add company rank
- if(prevCompanyData)
- {
- const outerRankDiv = document.createElement("div");
- const symbolDiv = document.createElement("div");
- const rankDiv = document.createElement("div");
-
- outerRankDiv.style.display = "flex";
- symbolDiv.style.width = "14px";
- symbolDiv.style.minWidth = "14px";
- symbolDiv.style.marginRight = "2px";
- const prevRank = prevCompanyData[ticker]?.rank;
- const increasing = prevRank < companyData[ticker].rank;
- if(prevRank && prevRank != companyData[ticker].rank)
- {
- symbolDiv.textContent = increasing ? "▼" : "▲";
- symbolDiv.style.color = increasing ? "#d9534f" : "#5cb85c";
- }
-
- rankDiv.textContent = companyData[ticker].rank;
- outerRankDiv.appendChild(symbolDiv);
- outerRankDiv.appendChild(rankDiv);
- tableDisplayRow.push(outerRankDiv);
- }
- else
- {
- const rankDiv = document.createElement("div");
- rankDiv.textContent = companyData[ticker].rank;
- tableDisplayRow.push(rankDiv);
- }
- // Add ticker
- const tickerDiv = document.createElement("div");
- tickerDiv.textContent = ticker;
- tableDisplayRow.push(tickerDiv);
- // Add amount
- const amountDiv = document.createElement("div");
- amountDiv.textContent = companyData[ticker].amount.toLocaleString(undefined, {maximumFractionDigits: 1});
- tableDisplayRow.push(amountDiv);
- // Add volume
- const volumeDiv = document.createElement("div");
- volumeDiv.textContent = "$" + companyData[ticker].volume.toLocaleString(undefined, {notation: "compact", maximumSignificantDigits: 3});
- tableDisplayRow.push(volumeDiv);
- // Add profit
- const profitDiv = document.createElement("div");
- var profitText: string;
- if(companyData[ticker].profit < 0)
- {
- profitText = "-$" + (-companyData[ticker].profit).toLocaleString(undefined, {notation: "compact", maximumSignificantDigits: 3});
- }
- else
- {
- profitText = "$" + companyData[ticker].profit.toLocaleString(undefined, {notation: "compact", maximumSignificantDigits: 3});
- }
- profitDiv.textContent = profitText;
- tableDisplayRow.push(profitDiv);
- tableData.push(tableRow);
- tableDisplay.push(tableDisplayRow);
- });
- // Sort by rank by default
- const indices = tableData.map((_, i) => i)
- .sort((a, b) => tableData[a][0] - tableData[b][0]);
- tableData = indices.map(i => tableData[i]);
- tableDisplay = indices.map(i => tableDisplay[i]);
- const title = "Production Ranking of " + companyName + " - " + prettyMonthName(configValues.month);
- const headers = ["Rank", "Ticker", "Amount [/day]", "Volume [$/day]", "Profit [$/day]"];
- createTable(plotContainerID, title, headers, tableData, tableDisplay);
- }
- }
|