Skip to content

Commit 973285d

Browse files
authored
fix: correct cabinet info section in promises page (#139)
* fix: cabinet info * refactor: code review
1 parent 7e806a5 commit 973285d

File tree

4 files changed

+99
-41
lines changed

4 files changed

+99
-41
lines changed

src/components/Promise/Home/AboutCard.svelte

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
<script lang="ts">
22
import PoliticianPicture from '$components/PoliticianPicture/PoliticianPicture.svelte';
33
import { ArrowRight } from 'carbon-icons-svelte';
4-
import type { CabinetSummary } from '../../../routes/promises/+page.server';
5-
import { formatThaiDate, shortMonthNames } from '$lib/date-parser';
4+
import type {
5+
CabinetSummary,
6+
PreviousCabinetSummary
7+
} from '../../../routes/promises/+page.server';
8+
import { formatThaiDate } from '$lib/date-parser';
69
710
export let cabinet: CabinetSummary;
11+
export let previousCabinet: PreviousCabinetSummary;
812
$: ({ primeMinister, policyStatement } = cabinet);
13+
$: previousCabinetMemberCountsByParty = previousCabinet.cabinetMemberCountsByParty;
914
</script>
1015

1116
<div class="flex w-full flex-col gap-4 bg-ui-05 p-6 text-text-04">
@@ -14,7 +19,7 @@
1419
<p class="heading-01">นายกรัฐมนตรี</p>
1520
<div class="flex flex-col gap-2">
1621
<div class="flex gap-2">
17-
<PoliticianPicture size="64" party={primeMinister.party} />
22+
<PoliticianPicture avatar={primeMinister.avatar} size="64" party={primeMinister.party} />
1823
<div>
1924
<p class="fluid-heading-04">{primeMinister.firstname} {primeMinister.lastname}</p>
2025
<p class="body-01">
@@ -28,12 +33,14 @@
2833
</div>
2934
<div class="flex flex-wrap">
3035
{#each cabinet.cabinetMemberCountsByParty as party}
31-
<div class="flex gap-1 py-1 pr-2">
36+
<div class="flex items-center gap-1 py-1 pr-3">
3237
{#if typeof party.party != 'string'}
3338
<img src={party.party.logo} class="block h-5 w-5 rounded-full" alt="" />
34-
<p>{party.party.name}</p>
39+
<p class="label-01">{party.party.name}</p>
40+
<p class="label-01 text-text-03">{party.count}</p>
3541
{:else}
36-
<p>{party.party}</p>
42+
<p class="label-01">{party.party}</p>
43+
<p class="label-01 text-text-03">{party.count}</p>
3744
{/if}
3845
</div>
3946
{/each}
@@ -59,21 +66,27 @@
5966
</div>
6067
<div class="flex flex-col gap-2 border-t border-ui-04 pt-3">
6168
<p class="label-01 text-text-03">
62-
รัฐบาลชุดที่ผ่านมาในสมัยการเลือกตั้ง {cabinet.startedAt.getFullYear() + 543}
69+
รัฐบาลชุดที่ผ่านมาในสมัยการเลือกตั้ง {previousCabinet.startedAt.getFullYear() + 543}
6370
</p>
6471
<ul class="list-disc">
6572
<li class="label-01 ml-5">
66-
นายกรัฐมนตรี{primeMinister.firstname}
67-
{primeMinister.lastname} และคณะรัฐมนตรีจาก
68-
{#each cabinet.cabinetMemberCountsByParty as party}
69-
{#if typeof party.party != 'string'}
70-
{party.party.name} ({party.count} ตำแหน่ง),&nbsp;
73+
นายกรัฐมนตรี{previousCabinet.primeMinister.firstname}
74+
{previousCabinet.primeMinister.lastname} และคณะรัฐมนตรีจาก
75+
{#each previousCabinetMemberCountsByParty as party, i}
76+
{#if typeof party.party !== 'string'}
77+
{party.party.name} ({party.count} ตำแหน่ง)
7178
{:else}
72-
{party.party}
79+
{party.party} ({party.count} ตำแหน่ง)
80+
{/if}
81+
{#if i < previousCabinetMemberCountsByParty.length - 1}
82+
,&nbsp
7383
{/if}
7484
{/each}
7585
<p class="label-01 text-text-03">
76-
{formatThaiDate(cabinet.startedAt, true)} - {formatThaiDate(new Date(), true)}
86+
{formatThaiDate(previousCabinet.startedAt, true)} - {formatThaiDate(
87+
previousCabinet.endedAt,
88+
true
89+
)}
7790
</p>
7891
</li>
7992
</ul>
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
<script lang="ts">
2-
import type { CabinetSummary } from '../../../routes/promises/+page.server';
2+
import type {
3+
CabinetSummary,
4+
PreviousCabinetSummary
5+
} from '../../../routes/promises/+page.server';
36
import AboutCard from './AboutCard.svelte';
47
export let cabinet: CabinetSummary;
8+
export let previousCabinet: PreviousCabinetSummary;
59
</script>
610

711
<div class="flex flex-col items-center gap-2 py-3">
812
<p class="fluid-heading-04">เกี่ยวกับรัฐบาล</p>
9-
<AboutCard {cabinet} />
13+
<AboutCard {cabinet} {previousCabinet} />
1014
</div>

src/routes/promises/+page.server.ts

Lines changed: 63 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
11
import { fetchAssemblies, fetchParties, fetchPoliticians, fetchPromises } from '$lib/datasheets';
2-
import { getAssemblyMembers } from '$lib/datasheets/assembly-member';
2+
import { getAssemblyMembers, type AssemblyMember } from '$lib/datasheets/assembly-member';
3+
import type { Assembly } from '$models/assembly';
34
import type { Party } from '$models/party';
45
import type { Politician } from '$models/politician';
56
import { PromiseStatus, type Promise, type PromiseSummary } from '$models/promise';
67
import { error } from '@sveltejs/kit';
7-
import type { Assembly } from 'carbon-icons-svelte';
88
import { groups } from 'd3';
99
import dayjs from 'dayjs';
1010

1111
const MAX_PROMISES_SAMPLE = 3;
1212

1313
export interface CabinetSummary extends Pick<Assembly, 'id' | 'startedAt'> {
14-
primeMinister: Pick<Politician, 'firstname' | 'lastname'> & { party?: Party };
14+
primeMinister: Pick<Politician, 'firstname' | 'lastname' | 'avatar'> & { party?: Party };
1515
cabinetMemberCount: number;
1616
cabinetMemberCountsByParty: { party: Party | 'ไม่สังกัดพรรค'; count: number }[];
1717
policyStatement: string;
1818
}
1919

20+
export interface PreviousCabinetSummary extends Pick<Assembly, 'id' | 'startedAt'> {
21+
primeMinister: Pick<Politician, 'firstname' | 'lastname'> & { party?: Party };
22+
cabinetMemberCountsByParty: { party: Party | 'ไม่สังกัดพรรค'; count: number }[];
23+
endedAt: Date;
24+
}
25+
2026
export type PromiseSample = Pick<Promise, 'id' | 'statements'>;
2127
export type PromiseCountByStatus = {
2228
[PromiseStatus.inProgress]: number;
@@ -36,26 +42,23 @@ export interface PromisesByCategory {
3642
count: number;
3743
}
3844

39-
const CURRENT_CABINET_ASSEMBLY_ID = 'คณะรัฐมนตรี-64';
40-
41-
export async function load() {
42-
const cabinetAssembly = (await fetchAssemblies()).find(
43-
(a) => a.id === CURRENT_CABINET_ASSEMBLY_ID
44-
);
45-
if (!cabinetAssembly) {
46-
error(500, `Cannot find the current cabinet: ${CURRENT_CABINET_ASSEMBLY_ID}`);
45+
function findPrimeMinister(cabinetMembers: AssemblyMember[]) {
46+
const primeMinister = cabinetMembers.find((m) => m.assemblyRole?.role === 'นายกรัฐมนตรี');
47+
if (!primeMinister) {
48+
error(500, `Cannot find the prime minister in the given cabinet`);
4749
}
50+
return primeMinister;
51+
}
4852

49-
const politicians = await fetchPoliticians();
50-
const parties = await fetchParties();
51-
const promises = await fetchPromises();
52-
53-
const cabinetMembers = getAssemblyMembers(cabinetAssembly, politicians).filter(
53+
function getCabinetMembers(cabinetAssembly: Assembly, politicians: Politician[]) {
54+
return getAssemblyMembers(cabinetAssembly, politicians).filter(
5455
({ assemblyRole }) =>
5556
!assemblyRole?.endedAt ||
5657
(cabinetAssembly.endedAt && !dayjs(cabinetAssembly.endedAt).isAfter(assemblyRole.endedAt))
5758
);
59+
}
5860

61+
function getCabinetMemberCountsByParty(cabinetMembers: AssemblyMember[], parties: Party[]) {
5962
const cabinetMemberCountsByPartyName = cabinetMembers
6063
.map((m) => m.partyRole?.party.name)
6164
.reduce(
@@ -67,7 +70,7 @@ export async function load() {
6770
{} as { [partyName: string]: number }
6871
);
6972

70-
const cabinetMemberCountsByParty = Object.entries(cabinetMemberCountsByPartyName).map(
73+
return Object.entries(cabinetMemberCountsByPartyName).map(
7174
([name, count]): { party: Party | 'ไม่สังกัดพรรค'; count: number } => {
7275
const party =
7376
name === 'ไม่สังกัดพรรค' ? 'ไม่สังกัดพรรค' : parties.find((p) => p.name === name);
@@ -76,16 +79,27 @@ export async function load() {
7679
}
7780
return {
7881
party,
79-
count
82+
count: count as number
8083
};
8184
}
8285
);
86+
}
8387

84-
const primeMinister = cabinetMembers.find((m) => m.assemblyRole?.role === 'นายกรัฐมนตรี');
88+
export async function load() {
89+
const assemblies: Assembly[] = await fetchAssemblies();
90+
const politicians: Politician[] = await fetchPoliticians();
91+
const parties: Party[] = await fetchParties();
92+
const promises: Promise[] = await fetchPromises();
8593

86-
if (!primeMinister) {
87-
error(500, `Cannot find the current prime minister in the given cabinet`);
88-
}
94+
const currentAndPreviousAssembiles = assemblies
95+
.filter((assembly) => assembly.name == 'คณะรัฐมนตรี')
96+
.sort((a, b) => b.term - a.term)
97+
.slice(0, 2);
98+
99+
const cabinetAssembly = currentAndPreviousAssembiles[0];
100+
const cabinetMembers = getCabinetMembers(cabinetAssembly, politicians);
101+
const cabinetMemberCountsByParty = getCabinetMemberCountsByParty(cabinetMembers, parties);
102+
const primeMinister = findPrimeMinister(cabinetMembers);
89103

90104
const mockPolicyStatement =
91105
'นางสาวแพทองธาร ชินวัตร นายกรัฐมนตรี ได้แถลงนโยบายต่อรัฐสภาเมื่อวันที่ 12 กันยายน 2567 โดยเน้นความท้าทายที่ประเทศไทยต้องเผชิญ เช่น การเติบโตทางเศรษฐกิจที่ต่ำกว่าศักยภาพ ปัญหาหนี้สิน ความเหลื่อมล้ำ และสิ่งแวดล้อม โดยรัฐบาลตั้งใจจะเปลี่ยนความท้าทายเหล่านี้ให้เป็นโอกาสและความเสมอภาคทางเศรษฐกิจและสังคม นโยบายเร่งด่วนของรัฐบาลประกอบด้วย 10 ข้อ อาทิ การปรับโครงสร้างหนี้ การกระตุ้นเศรษฐกิจผ่านดิจิทัลวอลเล็ต การลดราคาพลังงาน และการส่งเสริมการท่องเที่ยว รวมถึงแผนระยะยาวเพื่อพัฒนาเศรษฐกิจดิจิทัล ยานยนต์ไฟฟ้า และพลังงานสะอาด ';
@@ -96,13 +110,38 @@ export async function load() {
96110
primeMinister: {
97111
firstname: primeMinister.firstname,
98112
lastname: primeMinister.lastname,
99-
party: primeMinister.partyRole?.party
113+
party: primeMinister.partyRole?.party,
114+
avatar: primeMinister.avatar
100115
},
101116
cabinetMemberCount: cabinetMembers.length,
102117
cabinetMemberCountsByParty,
103118
policyStatement: mockPolicyStatement
104119
};
105120

121+
const previousCabinetAssembly = currentAndPreviousAssembiles[1];
122+
const previousCabinetMembers = getCabinetMembers(previousCabinetAssembly, politicians);
123+
const previousCabinetMemberCountsByParty = getCabinetMemberCountsByParty(
124+
previousCabinetMembers,
125+
parties
126+
);
127+
const previousPrimeMinister = findPrimeMinister(previousCabinetMembers);
128+
129+
if (!previousCabinetAssembly.endedAt) {
130+
error(500, `Previous cabinet not have endedAt`);
131+
}
132+
133+
const previousCabinet: PreviousCabinetSummary = {
134+
id: previousCabinetAssembly.id,
135+
startedAt: previousCabinetAssembly.startedAt,
136+
endedAt: previousCabinetAssembly.endedAt,
137+
primeMinister: {
138+
firstname: previousPrimeMinister.firstname,
139+
lastname: previousPrimeMinister.lastname,
140+
party: previousPrimeMinister.partyRole?.party
141+
},
142+
cabinetMemberCountsByParty: previousCabinetMemberCountsByParty
143+
};
144+
106145
const byStatus: PromisesByStatus[] = groups(promises, (p) => p.status).map(
107146
([status, promisesByStatus]) => ({
108147
status,
@@ -146,6 +185,7 @@ export async function load() {
146185

147186
return {
148187
cabinet,
188+
previousCabinet,
149189
byStatus,
150190
byCategory,
151191
activeCount: promises.filter(({ status }) => status !== PromiseStatus.notStarted).length,

src/routes/promises/+page.svelte

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
99
export let data;
1010
11-
$: ({ cabinet, activeCount, count, byStatus, byCategory, promiseSummaries } = data);
11+
$: ({ cabinet, previousCabinet, activeCount, count, byStatus, byCategory, promiseSummaries } =
12+
data);
1213
1314
let defaultFilterBy = {
1415
status: 'ทุกสถานะ',
@@ -75,7 +76,7 @@
7576
</ContentSection>
7677

7778
<ContentSection id="about">
78-
<AboutSection {cabinet} />
79+
<AboutSection {cabinet} {previousCabinet} />
7980
</ContentSection>
8081

8182
<ContentSection id="movement">

0 commit comments

Comments
 (0)