|
15 | 15 | country1: null, |
16 | 16 | country2: null, |
17 | 17 | populationAdjustment: 100, |
18 | | - gdpAdjustment: 100 |
| 18 | + gdpAdjustment: 100, |
| 19 | + rankingSeason: "Summer", |
| 20 | + rankingYear: null |
19 | 21 | }; |
20 | 22 |
|
21 | 23 | const medalOrder = ["Gold", "Silver", "Bronze"]; |
|
389 | 391 | "United States of America", |
390 | 392 | "USA" |
391 | 393 | ]) || countries.find(country => country !== state.country1) || countries[0] || null; |
| 394 | + |
| 395 | + state.rankingSeason = state.season; |
| 396 | + state.rankingYear = state.year; |
392 | 397 | } |
393 | 398 |
|
394 | 399 | function findPreferredCountry(countries, preferredNames) { |
|
884 | 889 | const root = d3.select("#fair-ranking-viz"); |
885 | 890 | if (root.empty()) return; |
886 | 891 |
|
887 | | - const countries = getAvailableCountries(state.season, state.year); |
| 892 | + if (!state.rankingYear) { |
| 893 | + state.rankingSeason = state.season; |
| 894 | + state.rankingYear = state.year; |
| 895 | + } |
| 896 | + |
| 897 | + const years = getAvailableYears(state.rankingSeason); |
| 898 | + const countries = getAvailableCountries(state.rankingSeason, state.rankingYear); |
| 899 | + |
| 900 | + const previousSeason = state.season; |
| 901 | + const previousYear = state.year; |
| 902 | + |
| 903 | + state.season = state.rankingSeason; |
| 904 | + state.year = state.rankingYear; |
888 | 905 |
|
889 | 906 | const rows = countries.map(country => { |
890 | 907 | const data = computeFairCounts(country); |
891 | | - |
892 | 908 | return { |
893 | 909 | country, |
894 | 910 | actual: data.actual, |
895 | 911 | fair: data.fair |
896 | 912 | }; |
897 | 913 | }); |
898 | 914 |
|
899 | | - const actualRanking = rows |
| 915 | + state.season = previousSeason; |
| 916 | + state.year = previousYear; |
| 917 | + |
| 918 | + const actualRanking = [...rows] |
900 | 919 | .sort((a, b) => |
901 | 920 | d3.descending(a.actual.Gold, b.actual.Gold) || |
902 | 921 | d3.descending(a.actual.Silver, b.actual.Silver) || |
903 | 922 | d3.descending(a.actual.Bronze, b.actual.Bronze) |
904 | 923 | ) |
905 | 924 | .slice(0, 10); |
906 | 925 |
|
907 | | - const fairRanking = rows |
| 926 | + const fairRanking = [...rows] |
908 | 927 | .sort((a, b) => |
909 | 928 | d3.descending(a.fair.Gold || 0, b.fair.Gold || 0) || |
910 | 929 | d3.descending(a.fair.Silver || 0, b.fair.Silver || 0) || |
|
913 | 932 | .slice(0, 10); |
914 | 933 |
|
915 | 934 | root.html(` |
| 935 | + <div class="fair-ranking-controls"> |
| 936 | + <label> |
| 937 | + Season: |
| 938 | + <select id="fair-ranking-season"> |
| 939 | + ${getAvailableSeasons().map(season => ` |
| 940 | + <option value="${season}" ${season === state.rankingSeason ? "selected" : ""}>${season}</option> |
| 941 | + `).join("")} |
| 942 | + </select> |
| 943 | + </label> |
| 944 | +
|
| 945 | + <label> |
| 946 | + Year: |
| 947 | + <select id="fair-ranking-year"> |
| 948 | + ${years.map(year => ` |
| 949 | + <option value="${year}" ${year === state.rankingYear ? "selected" : ""}>${year}</option> |
| 950 | + `).join("")} |
| 951 | + </select> |
| 952 | + </label> |
| 953 | + </div> |
| 954 | +
|
916 | 955 | <div class="fair-ranking-layout"> |
917 | 956 | ${rankingTable("Actual medal table", actualRanking, "actual")} |
918 | 957 | ${rankingTable("Fair medal table", fairRanking, "fair")} |
919 | 958 | </div> |
920 | 959 | `); |
| 960 | + |
| 961 | + d3.select("#fair-ranking-season").on("change", function () { |
| 962 | + state.rankingSeason = this.value; |
| 963 | + const newYears = getAvailableYears(state.rankingSeason); |
| 964 | + state.rankingYear = newYears.includes(state.rankingYear) |
| 965 | + ? state.rankingYear |
| 966 | + : newYears[newYears.length - 1]; |
| 967 | + renderRankingTable(); |
| 968 | + }); |
| 969 | + |
| 970 | + d3.select("#fair-ranking-year").on("change", function () { |
| 971 | + state.rankingYear = Number(this.value); |
| 972 | + renderRankingTable(); |
| 973 | + }); |
921 | 974 | } |
922 | 975 |
|
923 | 976 | function rankingTable(title, rows, type) { |
|
0 commit comments