companyRank.ts 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import { createGraph, createTable, switchPlot } from "../core";
  2. import { months, monthsPretty } from "../staticData/constants";
  3. import { addConfigField, clearChildren, getCompanyId, getData, prettyMonthName } from "../utils";
  4. import { Graph } from "./graph";
  5. export class CompanyRank implements Graph {
  6. id = "compRank";
  7. displayName = "Company Rank";
  8. configFieldIDs = ["month", "companyName"];
  9. loadedData: any;
  10. urlParams: any;
  11. constructor(loadedData: any, urlParams: any)
  12. {
  13. this.loadedData = loadedData;
  14. this.urlParams = urlParams;
  15. }
  16. setConfigs(useURLParams?: boolean)
  17. {
  18. const updateFunc = function() {switchPlot();}
  19. const configDiv = document.getElementById("selectorSubtypes");
  20. if(configDiv)
  21. {
  22. clearChildren(configDiv);
  23. }
  24. configDiv?.appendChild(addConfigField("select", "month", "Month: ", {prettyValues: monthsPretty, "values": months}, useURLParams && this.urlParams.month ? this.urlParams.month : months[months.length - 1], updateFunc));
  25. configDiv?.appendChild(addConfigField("input", "companyName", "Username: ", undefined, useURLParams ? this.urlParams.companyName : undefined, updateFunc, "-27px"));
  26. }
  27. async generatePlot(configValues: any, plotContainerID: string)
  28. {
  29. if(!configValues.companyName || configValues.companyName == ""){return;}
  30. // Get Company Data
  31. const knownCompanies = await getData(this.loadedData, "knownCompanies");
  32. // Get Company ID
  33. var companyID = await getCompanyId(configValues.companyName, this.loadedData) as string;
  34. if(!companyID){ return; }
  35. var companyName = knownCompanies[companyID];
  36. // Get Data
  37. const fullCompanyData = await getData(this.loadedData, "company", configValues.month); // Company data for the current month
  38. const fullPrevCompanyData = configValues.month == months[0] ? {individual: {}} : await getData(this.loadedData, "company", months[months.indexOf(configValues.month) - 1])
  39. const companyData = fullCompanyData.individual[companyID]; // Company data for this company for this month
  40. const prevCompanyData = fullPrevCompanyData.individual[companyID]; // Company data for this company for last month. May be undefined.
  41. if(!companyData){return;}
  42. var tableData = [] as any[]; // Entries in the table in raw data form
  43. var tableDisplay = [] as any[]; // Entries in the table in presentable form
  44. Object.keys(companyData).forEach(ticker => {
  45. const tableRow = [companyData[ticker].rank, ticker, companyData[ticker].amount, companyData[ticker].volume, companyData[ticker].profit];
  46. const tableDisplayRow = [] as any[];
  47. // Add company rank
  48. if(prevCompanyData)
  49. {
  50. const outerRankDiv = document.createElement("div");
  51. const symbolDiv = document.createElement("div");
  52. const rankDiv = document.createElement("div");
  53. outerRankDiv.style.display = "flex";
  54. symbolDiv.style.width = "14px";
  55. symbolDiv.style.minWidth = "14px";
  56. symbolDiv.style.marginRight = "2px";
  57. const prevRank = prevCompanyData[ticker]?.rank;
  58. const increasing = prevRank < companyData[ticker].rank;
  59. if(prevRank && prevRank != companyData[ticker].rank)
  60. {
  61. symbolDiv.textContent = increasing ? "▼" : "▲";
  62. symbolDiv.style.color = increasing ? "#d9534f" : "#5cb85c";
  63. }
  64. rankDiv.textContent = companyData[ticker].rank;
  65. outerRankDiv.appendChild(symbolDiv);
  66. outerRankDiv.appendChild(rankDiv);
  67. tableDisplayRow.push(outerRankDiv);
  68. }
  69. else
  70. {
  71. const rankDiv = document.createElement("div");
  72. rankDiv.textContent = companyData[ticker].rank;
  73. tableDisplayRow.push(rankDiv);
  74. }
  75. // Add ticker
  76. const tickerDiv = document.createElement("div");
  77. tickerDiv.textContent = ticker;
  78. tableDisplayRow.push(tickerDiv);
  79. // Add amount
  80. const amountDiv = document.createElement("div");
  81. amountDiv.textContent = companyData[ticker].amount.toLocaleString(undefined, {maximumFractionDigits: 1});
  82. tableDisplayRow.push(amountDiv);
  83. // Add volume
  84. const volumeDiv = document.createElement("div");
  85. volumeDiv.textContent = "$" + companyData[ticker].volume.toLocaleString(undefined, {notation: "compact", maximumSignificantDigits: 3});
  86. tableDisplayRow.push(volumeDiv);
  87. // Add profit
  88. const profitDiv = document.createElement("div");
  89. var profitText: string;
  90. if(companyData[ticker].profit < 0)
  91. {
  92. profitText = "-$" + (-companyData[ticker].profit).toLocaleString(undefined, {notation: "compact", maximumSignificantDigits: 3});
  93. }
  94. else
  95. {
  96. profitText = "$" + companyData[ticker].profit.toLocaleString(undefined, {notation: "compact", maximumSignificantDigits: 3});
  97. }
  98. profitDiv.textContent = profitText;
  99. tableDisplayRow.push(profitDiv);
  100. tableData.push(tableRow);
  101. tableDisplay.push(tableDisplayRow);
  102. });
  103. // Sort by rank by default
  104. const indices = tableData.map((_, i) => i)
  105. .sort((a, b) => tableData[a][0] - tableData[b][0]);
  106. tableData = indices.map(i => tableData[i]);
  107. tableDisplay = indices.map(i => tableDisplay[i]);
  108. const title = "Production Ranking of " + companyName + " - " + prettyMonthName(configValues.month);
  109. const headers = ["Rank", "Ticker", "Amount [/day]", "Volume [$/day]", "Profit [$/day]"];
  110. createTable(plotContainerID, title, headers, tableData, tableDisplay);
  111. }
  112. }