Skip to content

Commit ac795b7

Browse files
committed
update map
1 parent e214508 commit ac795b7

File tree

2 files changed

+137
-98
lines changed

2 files changed

+137
-98
lines changed

data/members.yaml

Lines changed: 64 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,87 @@
11
members:
2-
- name: "Daniel Izquierdo Cortázar"
3-
role: "President"
4-
location: "Spain"
5-
area: "Spain"
6-
7-
- name: "Yuki Hattori"
8-
role: "Vice President"
9-
location: "Japan"
10-
area: "japan"
11-
122
- name: "Matt Cobby"
133
role: "Secretary"
14-
location: "Australia"
154
area: "Australia"
165

17-
- name: "Katie Schueths"
18-
role: "Assistant Secretary"
19-
location: "United States of America"
20-
area: "United States of America"
6+
- name: "Ada Dai"
7+
role: "Member"
8+
area: "China"
219

22-
- name: "Tom Sadler"
23-
role: "Treasurer"
24-
location: "United Kingdom"
25-
area: "GBR"
10+
- name: "Fei Wan"
11+
role: "Member"
12+
area: "China"
13+
14+
- name: "Jerry Tan"
15+
role: "Member"
16+
area: "China"
17+
18+
- name: "Willem Jiang"
19+
role: "Member"
20+
area: "China"
21+
22+
- name: "Thomas Froment"
23+
role: "Member"
24+
area: "France"
2625

2726
- name: "Georg Grütter"
2827
role: "Assistant Treasurer"
29-
location: "Germany"
30-
area: "germany"
28+
area: "Germany"
29+
30+
- name: "Sebastian Spier"
31+
role: "Board Member"
32+
area: "Germany"
33+
34+
- name: "Guilherme Dellagustin"
35+
role: "Member"
36+
area: "Germany"
37+
38+
- name: "Isabel Drost-Fromm"
39+
role: "Member"
40+
area: "Germany"
41+
42+
- name: "Maximilian Capraro"
43+
role: "Member"
44+
area: "Germany"
45+
46+
- name: "Tom Sadler"
47+
role: "Treasurer"
48+
area: "United Kingdom"
3149

3250
- name: "Danese Cooper"
3351
role: "Board Member"
34-
location: "Ireland"
3552
area: "Ireland"
3653

3754
- name: "Clare Dillon"
3855
role: "Board Member"
39-
location: "Ireland"
4056
area: "Ireland"
4157

42-
- name: "Sebastian Spier"
43-
role: "Board Member"
44-
location: "Germany"
45-
area: "germany"
58+
- name: "Cristina Coffey"
59+
role: "Member"
60+
area: "Ireland"
4661

47-
- name: "Ada Dai"
62+
- name: "Klaas-Jan Stol"
4863
role: "Member"
49-
area: "China"
64+
area: "Ireland"
65+
66+
- name: "Yuki Hattori"
67+
role: "Vice President"
68+
area: "japan"
69+
70+
- name: "Daniel Izquierdo Cortázar"
71+
role: "President"
72+
area: "Spain"
73+
74+
- name: "Igor Zubaiurre"
75+
role: "Member"
76+
area: "Spain"
77+
78+
- name: "Mishari Muqbil"
79+
role: "Member"
80+
area: "Thailand"
81+
82+
- name: "Katie Schueths"
83+
role: "Assistant Secretary"
84+
area: "United States of America"
5085

5186
- name: "Addie Girouard"
5287
role: "Member"
@@ -68,27 +103,6 @@ members:
68103
role: "Member"
69104
area: "United States of America"
70105

71-
- name: "Cristina Coffey"
72-
role: "Member"
73-
area: "Ireland"
74-
75-
- name: "Fei Wan"
76-
role: "Member"
77-
area: "China"
78-
79-
- name: "Guilherme Dellagustin"
80-
role: "Member"
81-
area: "Germany"
82-
83-
- name: "Igor Zubaiurre"
84-
role: "Member"
85-
location: "Spain"
86-
area: "Spain"
87-
88-
- name: "Isabel Drost-Fromm"
89-
role: "Member"
90-
area: "Germany"
91-
92106
- name: "Jacob Green"
93107
role: "Member"
94108
area: "United States of America"
@@ -97,26 +111,10 @@ members:
97111
role: "Member"
98112
area: "United States of America"
99113

100-
- name: "Jerry Tan"
101-
role: "Member"
102-
area: "China"
103-
104114
- name: "Justin Gosses"
105115
role: "Member"
106116
area: "United States of America"
107117

108-
- name: "Klaas-Jan Stol"
109-
role: "Member"
110-
area: "Ireland"
111-
112-
- name: "Maximilian Capraro"
113-
role: "Member"
114-
area: "Germany"
115-
116-
- name: "Mishari Muqbil"
117-
role: "Member"
118-
area: "Thailand"
119-
120118
- name: "Russell Rutledge"
121119
role: "Executive Director"
122120
area: "United States of America"
@@ -125,18 +123,10 @@ members:
125123
role: "Member"
126124
area: "United States of America"
127125

128-
- name: "Thomas Froment"
129-
role: "Member"
130-
area: "France"
131-
132126
- name: "Tim Yao"
133127
role: "Member"
134128
area: "United States of America"
135129

136-
- name: "Willem Jiang"
137-
role: "Member"
138-
area: "China"
139-
140130
- name: "Zack Koppert"
141131
role: "Member"
142132
area: "United States of America"

js/app.js

Lines changed: 73 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,14 @@ function updateMembersList() {
184184
// アクティブな地域を追跡
185185
let activeCard = null;
186186

187-
// 地域ごとにカードを作成
188-
Object.entries(groupedMembers).forEach(([area, areaMembers]) => {
187+
// エリアをアルファベット順にソート
188+
const sortedAreas = Object.keys(groupedMembers).sort((a, b) => {
189+
return a.toLowerCase().localeCompare(b.toLowerCase());
190+
});
191+
192+
// 地域ごとにカードを作成(ソートされた順序で)
193+
sortedAreas.forEach(area => {
194+
const areaMembers = groupedMembers[area];
189195
const regionCard = document.createElement('div');
190196
regionCard.className = 'region-card';
191197

@@ -212,12 +218,35 @@ function updateMembersList() {
212218
regionCard.setAttribute('data-area', area);
213219
regionCard.setAttribute('data-country-code', countryCode);
214220
regionCard.id = `region-${countryCode}`;
221+
222+
// メンバーを役職でソート
223+
const sortedMembers = areaMembers.sort((a, b) => {
224+
// 役職の優先順位を定義
225+
const rolePriority = {
226+
'President': 1,
227+
'Vice President': 2,
228+
'Secretary': 3,
229+
'Assistant Secretary': 4,
230+
'Treasurer': 5,
231+
'Assistant Treasurer': 6,
232+
'Executive Director': 7,
233+
'Board Member': 8,
234+
'Member': 9
235+
};
236+
237+
// 役職が同じ場合は名前でソート
238+
if (rolePriority[a.role] === rolePriority[b.role]) {
239+
return a.name.localeCompare(b.name);
240+
}
241+
242+
return rolePriority[a.role] - rolePriority[b.role];
243+
});
215244

216245
regionCard.innerHTML = `
217246
<h3>${areaData.name || area}</h3>
218-
<div class="member-count">${areaMembers.length} member(s)</div>
247+
<div class="member-count">${sortedMembers.length} member(s)</div>
219248
<div class="member-list">
220-
${areaMembers.map(member => `
249+
${sortedMembers.map(member => `
221250
<div class="member-item">
222251
<div class="member-name">${member.name}</div>
223252
<div class="member-role">${member.role}</div>
@@ -252,13 +281,32 @@ function updateMembersList() {
252281
async function initGlobe() {
253282
console.log('Initializing globe...'); // デバッグ用ログ
254283
const container = document.getElementById('globe-container');
284+
const membersPanel = document.getElementById('members-panel');
255285

256286
try {
257287
console.log('Loading world data...'); // デバッグ用ログ
258288
// 世界地図データの読み込み
259289
const worldData = await fetch('https://unpkg.com/world-atlas/countries-110m.json').then(res => res.json());
260290
const worldCountries = topojson.feature(worldData, worldData.objects.countries);
261291

292+
// 右ペインの幅を考慮してコンテナの位置を調整
293+
function updateGlobePosition() {
294+
const panelWidth = membersPanel ? membersPanel.offsetWidth : 0;
295+
const windowWidth = window.innerWidth;
296+
const windowHeight = window.innerHeight;
297+
298+
// 地球儀の表示領域を計算(右ペインを除いた領域の中央)
299+
const globeAreaWidth = windowWidth - panelWidth;
300+
container.style.width = `${globeAreaWidth}px`;
301+
container.style.height = `${windowHeight}px`;
302+
container.style.position = 'absolute';
303+
container.style.left = '0';
304+
container.style.top = '0';
305+
}
306+
307+
// 初期位置の設定
308+
updateGlobePosition();
309+
262310
globe = Globe()(container)
263311
.globeImageUrl('https://unpkg.com/three-globe/example/img/earth-night.jpg')
264312
.backgroundImageUrl('https://unpkg.com/three-globe/example/img/night-sky.png')
@@ -384,8 +432,9 @@ async function initGlobe() {
384432

385433
// ウィンドウリサイズ時の処理
386434
window.addEventListener('resize', () => {
387-
globe.width([window.innerWidth]);
388-
globe.height([window.innerHeight]);
435+
updateGlobePosition();
436+
globe.width([container.offsetWidth]);
437+
globe.height([container.offsetHeight]);
389438
});
390439

391440
} catch (error) {
@@ -403,25 +452,25 @@ function getAreaNameFromCountryCode(countryCode) {
403452
}
404453

405454
// 地球儀のハイライトを更新
406-
function updateGlobeHighlight(location, states = null) {
455+
function updateGlobeHighlight(area, states = null) {
407456
globe.polygonLabel(({ properties: d, id }) => {
408-
if (location === 'USA') {
457+
if (area === 'USA') {
409458
// USAの場合、選択された州のみラベル表示
410459
const stateFips = properties?.STATEFP;
411-
const stateLocation = states?.find(state =>
412-
AREA_DATA[members.find(m => m.location === state).area].center[1] === properties?.INTPTLAT
413-
&& AREA_DATA[members.find(m => m.location === state).area].center[0] === properties?.INTPTLON
460+
const stateArea = states?.find(state =>
461+
AREA_DATA[members.find(m => m.area === state).area].center[1] === properties?.INTPTLAT
462+
&& AREA_DATA[members.find(m => m.area === state).area].center[0] === properties?.INTPTLON
414463
);
415464

416-
if (stateLocation) {
417-
const stateMembers = members.filter(m => m.location === stateLocation);
418-
return createLabel(stateLocation, stateMembers);
465+
if (stateArea) {
466+
const stateMembers = members.filter(m => m.area === stateArea);
467+
return createLabel(stateArea, stateMembers);
419468
}
420469
} else {
421-
const memberArea = members.find(m => m.location === location)?.area;
470+
const memberArea = members.find(m => m.area === area)?.area;
422471
const areaData = AREA_DATA[memberArea];
423472
if (areaData && d.ISO_A3 === getCountryAlpha3(areaData.countryCode)) {
424-
return createLabel(location, members.filter(m => m.location === location));
473+
return createLabel(area, members.filter(m => m.area === area));
425474
}
426475
}
427476
return null;
@@ -433,16 +482,16 @@ function updateGlobeHighlight(location, states = null) {
433482
return;
434483
}
435484

436-
if (location === 'USA') {
485+
if (area === 'USA') {
437486
const stateFips = hoverD.properties?.STATEFP;
438487
if (stateFips && states?.some(state =>
439-
AREA_DATA[members.find(m => m.location === state).area].center[1] === hoverD.properties?.INTPTLAT
440-
&& AREA_DATA[members.find(m => m.location === state).area].center[0] === hoverD.properties?.INTPTLON
488+
AREA_DATA[members.find(m => m.area === state).area].center[1] === hoverD.properties?.INTPTLAT
489+
&& AREA_DATA[members.find(m => m.area === state).area].center[0] === hoverD.properties?.INTPTLON
441490
)) {
442491
globe.polygonAltitude(d => d === hoverD ? 0.12 : 0.01);
443492
}
444493
} else {
445-
const memberArea = members.find(m => m.location === location)?.area;
494+
const memberArea = members.find(m => m.area === area)?.area;
446495
const areaData = AREA_DATA[memberArea];
447496
if (areaData && hoverD.properties?.ISO_A3 === getCountryAlpha3(areaData.countryCode)) {
448497
globe.polygonAltitude(d => d === hoverD ? 0.12 : 0.01);
@@ -452,12 +501,12 @@ function updateGlobeHighlight(location, states = null) {
452501
}
453502

454503
// ラベルのHTML生成
455-
function createLabel(location, locationMembers) {
504+
function createLabel(area, areaMembers) {
456505
return `
457506
<div style="background: white; padding: 10px; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.2);">
458-
<div style="font-weight: bold; color: #2c3e50;">${location}</div>
459-
<div style="color: #7f8c8d; margin-top: 5px;">Members: ${locationMembers.length}</div>
460-
${locationMembers.map(member => `
507+
<div style="font-weight: bold; color: #2c3e50;">${area}</div>
508+
<div style="color: #7f8c8d; margin-top: 5px;">Members: ${areaMembers.length}</div>
509+
${areaMembers.map(member => `
461510
<div style="color: #7f8c8d; margin-top: 3px;">
462511
${member.name} (${member.role})
463512
</div>

0 commit comments

Comments
 (0)