diff --git a/cms/README.md b/cms/README.md index 4314ce4..82ac946 100644 --- a/cms/README.md +++ b/cms/README.md @@ -1,9 +1,7 @@ # เวปประกาศข่าว (CMS TOR 6.6.4) การพัฒนาแบบที่เป็นอยู่ Vue(SPA)+dotnet(Web API) ของบริษัทไม่ได้รองรับ SEO เท่าใดนัก จำเป็นต้องใช้ Meta Framework ที่รองรับ SSR เช่น Nuxt.js เนื่องจากไม่ขึ้นกับส่วนอื่นมากนัก จะทดลองใช้เทคโนโลยีแบบใหม่ๆในการพัฒนา ที่ง่ายในการพัฒนากว่าเดิมจะ SvelteKit เป็นฐาน Daisy UI และ Daisy UI สำหรับการทำ Frontend และจะนำเครื่องมือในการ Automate ต่างๆมาร่วมด้วย -- [Sveltekit](https://www.youtube.com/watch?v=uEJ-Rnm2yOE) Meta JS Framework รองรับ SSR เขียนง่าย +- [Sveltekit](https://www.youtube.com/watch?v=uEJ-Rnm2yOE) Meta JS Framework รองรับ SSR เขียนง่าย ทำ Frontend และ Backend (API) ได้ในตัวเดียว - [TailWindCSS](https://tailwindcss.com/) ติดตั้งด้วย [svelte-add](https://github.com/svelte-add/tailwindcss) -- [marked](https://marked.js.org/) รองรับ Markdown สำหรับเนื้อหาที่ซับซ้อน -- - [Daisy UI ](https://daisyui.com/) UI Component ที่ใช้ TailWindCSS ใช้ได้ไม่จำกัด Framework มีวิธีการใช้ดูใน[ลิงค์นี้](https://github.com/schooltechx/youtube/blob/main/svelte/component/DaisyUI.md) - [PWA](https://web.dev/progressive-web-apps/) ทำให้ Web App เหมือนแอปมือถือ - [Playwright](https://playwright.dev/) เขียนโค้ดทำการทดสอบเวปแอปบน Browser @@ -11,7 +9,8 @@ - [GitHub Actions](https://github.com/features/actions) ทำ CI/CD ในระบบทดสอบ - [nektos/act](https://github.com/nektos/act) ใช้ GitHub Actions บนเครื่องของเราเอง - [Argo CD](https://argo-cd.readthedocs.io/en/stable/) deploy ขึ้นระบบ Production (K8s) -- [FullCalendar](https://github.com/schooltechx/youtube/blob/main/svelte/component/FullCalendar.md) รองรับพ.ศ. ใช้แค่ฟีเจอร์[ฟรีก็น่าจะพอ](https://fullcalendar.io/license#:~:text=or%20FullCalendar%20Premium.-,FullCalendar%20Standard,all%20copyright%20headers%20are%20preserved.) +- [FullCalendar](https://github.com/schooltechx/youtube/blob/main/svelte/component/FullCalendar.md) รองรับพ.ศ. ใช้แค่ฟีเจอร์[ฟรีก็น่าจะพอ](https://fullcalendar.io/license#:~:text=or%20FullCalendar%20Premium.-,FullCalendar%20Standard,all%20copyright%20headers%20are%20preserved.) +- [Day.js](https://day.js.org/) ในฟอร์แม็ตวันในรูปแบบ local ไทยรองรับ พ.ศ. ## วีดีโอแสดงการทำงานทั้งหมด [![Automate Development](https://img.youtube.com/vi/7CER67WVWec/0.jpg)](https://youtu.be/7CER67WVWec "Automate Development") @@ -21,26 +20,27 @@ ## Install คำสั่งสำหรับเริ่มต้นสร้างโปรเจ็กเปล่าๆ จนใช้งาน ``` bash -# เลือก Skeleton project,Typescript แล้ว ติดตั้งทั้งหมด +# สร้างโปรเจ็ก SvelteKit เลือก Skeleton project,Typescript แล้ว ติดตั้งทั้งหมด npm create svelte@latest cms-recruit cd cms-recruit npm install -# ติดตั้ง Mdsvex -npm i --save-dev mdsvex # ติดตั้ง Tailwindcss พร้อมเซ็ตค่าให้เรียบร้อย npx svelte-add@latest tailwindcss # เมื่อติดตั้ง daisyui ให้ดูวิธีการตั้งค่าเพิ่มจากในเวป npm i daisyui # ใช้สำหรับทำเป็น Node.js ทำ Docker Image npm i -D @sveltejs/adapter-node -# Keycloak สำหรับ frontend และ backend -npm i -D keycloak-js keycloak-backend +# Day.js +npm i dayjs +# FullCalendar +npm i @fullcalendar/core +npm i @fullcalendar/daygrid +npm i @fullcalendar/interaction # ช่วยทำ seo ให้ง่ายขึ้น npm install -D svelte-seo ``` - ## Sveltekit -คำสั่งที่ใช้ +คำสั่งที่ใช้รันโปรเจ็ก ``` bash npm run dev -- --port=4000 --host=0.0.0.0 npm run build @@ -53,9 +53,25 @@ npx vite preview --port=4000 --host=0.0.0.0 โครงสร้างโค้ด - หน้าเวปอยู่ใน [src/routes/](src/routes/) โครงหน้าหลัก +layout.svelte,หน้าต่างๆ +page.svelte - library/component ที่ใช้ร่วมกัน [src/lib/](src/lib/) -ตัวอย่างการใช้ API โค้ดอยู่ใน [src/routes/api/users](./src/routes/api/users/) -- http://localhost:4000/api/users -- http://localhost:4000/api/users/1 +สร้าง Mockup API โค้ดอยู่ใน [src/routes/api/](./src/routes/api/) +เพื่อความเรียบง่ายสไตล์ CMS การดึงค่าจะเรียงจากใหม่ไปเก่าเสมอ มี limit เพื่อลดปริมาณข้อมูล ถ้าไม่มี limit ดึงข้อมูลล่าสุดไปจนถึง Today+12month + +ตัวอย่าง endpoint มีดังนี้ +- http://localhost:4000/api/dev +- http://localhost:4000/api/info +- http://localhost:4000/api/content?page=home +- http://localhost:4000/api/content?page=about +- http://localhost:4000/api/competitive +- http://localhost:4000/api/competitive?limit=3 +- http://localhost:4000/api/competitive/19 +- http://localhost:4000/api/qualifying +- http://localhost:4000/api/qualifying?limit=3 +- http://localhost:4000/api/qualifying/21 + +ถ้าไม่ build เอง ตอนนี้มี demo อยู่ที่ [https://bma-qualifying.frappet.synology.me/](https://bma-qualifying.frappet.synology.me/) ให้เปลี่ยน base url ให้เหมาะสม + +Data Type ที่ใช้ดูในไฟล์ [CMSDataType.ts](./src/lib/data/CMSDataType.ts) + ## Browser Testing ใช้ Playwright มีคอนฟิกไฟล์ [playwright.config.ts](./playwright.config.ts) โค้ดสำหรับการทดสอบจะอยู่ใน โฟลเดอร์ [tests](./tests/) ใน VS Code จะติดตั้ง Playwright Extension รูปเป็นเหมือนโหลรูปชมพู่สำหรับทดลองวิทยาศาสตร์ ให้กดปุ่มเล่นเพื่อทำการทดสอบ diff --git a/cms/src/lib/data/CMSDataType.ts b/cms/src/lib/data/CMSDataType.ts index 2ae720b..e52861f 100644 --- a/cms/src/lib/data/CMSDataType.ts +++ b/cms/src/lib/data/CMSDataType.ts @@ -1,14 +1,18 @@ export interface Exam { id:string; title:string; - date:string; - start?:Date|string; - end?:Date|string; - exam_date?:Date|string; - announcement_date?:Date|string; + detail?:string; + date?:string; + start?:string; + end?:string; + exam_date?:string; + announcement_date?:string; category_id?:string category?:string - img?:string; + image?:string; + images?:{title:string,url:string}[]; + files?:{title:string,url:string}[]; + } export interface CalendarEvent { id:string; diff --git a/cms/src/lib/data/competitive-exam.json b/cms/src/lib/data/competitive-exam.json index bea42db..ec15d74 100644 --- a/cms/src/lib/data/competitive-exam.json +++ b/cms/src/lib/data/competitive-exam.json @@ -1,15 +1,13 @@ [ { "id":"20", - "date":"24 เม.ย. 2566 ", "start":"2023-04-24", "detail":"

ประกาศรายชื่อผู้ผ่านภาค ข. และมีสิทธิสอบภาค ค. ในการคัดเลือกคนพิการ ครั้งที่ 1/2565

", "title":"ประกาศรายชื่อผู้ผ่านภาค ข. และมีสิทธิสอบภาค ค. ในการคัดเลือกคนพิการ ครั้งที่ 1/2565", - "img":"/images/c1.jpg", "images":[ { - "title":"ภาพ1", - "url":"https://bma-qualifying.frappet.synology.me/images/c1.jpg" + "title":"topic", + "url":"/images/c1.jpg" } ], "files":[ @@ -49,34 +47,50 @@ }, { "id":"19", - "date":"13 เม.ย. 2566", "start":"2023-04-20T09:00:00", "detail":"ใครลืมส่งเอกสาร !! สำหรับการคัดเลือกคนพิการฯ ครั้งที่ 1/2565 ส่งเอกสารเพิ่มได้", "title":"ใครลืมส่งเอกสาร !! สำหรับการคัดเลือกคนพิการฯ ครั้งที่ 1/2565 ส่งเอกสารเพิ่มได้", - "img":"/images/c2.jpg" + "images":[ + { + "title":"topic", + "url":"/images/c2.jpg" + } + ] }, { "id":"18", - "date":"9 เม.ย. 2566", "start":"2023-03-28T09:00:00", "detail":"แผนที่การเดินทางมาสนามสอบคนพิการฯ ครั้งที่ 1/2565", "title":"แผนที่การเดินทางมาสนามสอบคนพิการฯ ครั้งที่ 1/2565", - "img":"/images/c3.jpg" + "images":[ + { + "title":"topic", + "url":"/images/c3.jpg" + } + ] }, { "id":"17", - "date":"28 มี.ย. 2566", "start":"2023-03-28T09:00:00", "detail":"การสอบแข่งขันเพื่อรรจุและแต่งตั้งบุคคลเข้ารับราชการเป็นข้าราชการกรุงเทพมหานครสามัญ ครั้งที่ 2/2566", "title":"การสอบแข่งขันเพื่อรรจุและแต่งตั้งบุคคลเข้ารับราชการเป็นข้าราชการกรุงเทพมหานครสามัญ ครั้งที่ 2/2566", - "img":"/images/c1.jpg" + "images":[ + { + "title":"topic", + "url":"/images/c1.jpg" + } + ] }, { "id":"16", - "date":"10 มี.ค. 2556", "start":"2023-03-10T09:00:00", "detail":"การสอบแข่งขันเพื่อรรจุและแต่งตั้งบุคคลเข้ารับราชการเป็นข้าราชการกรุงเทพมหานครสามัญ ครั้งที่ 1/2565", "title":"การสอบแข่งขันเพื่อรรจุและแต่งตั้งบุคคลเข้ารับราชการเป็นข้าราชการกรุงเทพมหานครสามัญ ครั้งที่ 1/2565", - "img":"/images/c2.jpg" + "images":[ + { + "title":"topic", + "url":"/images/c2.jpg" + } + ] } ] \ No newline at end of file diff --git a/cms/src/lib/data/qualify-exam.json b/cms/src/lib/data/qualify-exam.json index 7637f93..416c495 100644 --- a/cms/src/lib/data/qualify-exam.json +++ b/cms/src/lib/data/qualify-exam.json @@ -1,14 +1,23 @@ [ { "id":"21", - "date":"24 เม.ย. 2566","institute":"สำนักงาน ก.ก.","institute_id":1, + "catetory":"สำนักงาน ก.ก.","catetory_id":1, "start":"2023-04-24", "title":"ด่วน !! ประกาศวัน เวลา สถานที่ และระเบียบการคัดเลือกลูกจ้างกทม.", "detail":"


สำนักงานคณะกรรมการข้าราชการกรุงเทพมหานคร ประกาศกำหนดวัน เวลา สถานที่คัดเลือก และระเบียบ เกี่ยวกับการคัดเลือกบุคลากรกรุงเทพมหานครหรือผู้ปฏิบัติงานอื่นในกรุงเทพมหานครเพื่อบรรจุและแต่งตั้ง เป็นข้าราชการกรุงเทพมหานครสามัญ ครั้งที่ 1 / 2565

", - "img":"/images/sel1.png", + "images":[ + { + "title":"topic", + "url":"/images/sel1.png" + }, + { + "title":"การแต่งกาย", + "url":"https://webportal.bangkok.go.th/public/user_files_editor/305/bkkgovjob202303_12.jpg" + } + ], "files":[ { - "title":"รายละเอียดประกาศฯ", + "title":"รายละเอียดประกาศ", "url":"https://webportal.bangkok.go.th/public/user_files_editor/305/%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B8%81%E0%B8%B2%E0%B8%A8%E0%B8%A7%E0%B8%B1%E0%B8%99%20%E0%B9%80%E0%B8%A7%E0%B8%A5%E0%B8%B2%20%E0%B8%AA%E0%B8%96%E0%B8%B2%E0%B8%99%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%84%E0%B8%B1%E0%B8%94%E0%B9%80%E0%B8%A5%E0%B8%B7%E0%B8%AD%E0%B8%81%E0%B8%A5%E0%B8%B9%E0%B8%81%E0%B8%88%E0%B9%89%E0%B8%B2%E0%B8%87%E0%B8%AF.pdf" }, { @@ -26,50 +35,63 @@ { "title":"แผนผังสนามสอบ", "url":"https://file.thaijobjob.com/prakad/bkkgovjob202303/bkkgovjob202303_14" - }, - { - "title":"การแต่งกาย", - "url":"https://webportal.bangkok.go.th/public/user_files_editor/305/bkkgovjob202303_12.jpg" } - ] }, { "id":"20", - "date":"3 เม.ย. 2566","institute":"สำนักงาน ก.ก.","institute_id":1, + "catetory":"สำนักงาน ก.ก.","catetory_id":1, "start":"2023-04-03", "title":"วัน เวลา สถานที่ และระเบียบการคัดเลือกลูกจ้างกทม.", "detail":"ด่วน !! ประกาศวัน เวลา สถานที่ และระเบียบการคัดเลือกลูกจ้างกทม.", - "img":"/images/sel2.png", - "docUrl":"https://webportal.bangkok.go.th/public/user_files_editor/305/%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B8%81%E0%B8%B2%E0%B8%A8%E0%B8%A7%E0%B8%B1%E0%B8%99%20%E0%B9%80%E0%B8%A7%E0%B8%A5%E0%B8%B2%20%E0%B8%AA%E0%B8%96%E0%B8%B2%E0%B8%99%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%84%E0%B8%B1%E0%B8%94%E0%B9%80%E0%B8%A5%E0%B8%B7%E0%B8%AD%E0%B8%81%E0%B8%A5%E0%B8%B9%E0%B8%81%E0%B8%88%E0%B9%89%E0%B8%B2%E0%B8%87%E0%B8%AF.pdf" + "images":[ + { + "title":"topic", + "url":"/images/sel2.png" + } + ] }, { "id":"19", - "date":"20 ธันวาคม 2566","institute":"สำนักการแพทย์","institute_id":3, + "catetory":"สำนักการแพทย์","catetory_id":3, "start":"2003-12-20", "title":"ประกาศรับสมัครคัดเลือกบุคลากรกทม. !!", - "img":"/images/sel3.png", - "detail":"ประกาศรับสมัครคัดเลือกบุคลากรกทม. !!" + "detail":"ประกาศรับสมัครคัดเลือกบุคลากรกทม. !!", + "images":[ + { + "title":"topic", + "url":"/images/sel3.png" + } + ] + }, { "id":"18", - "date":"50 พ.ย. 2566","institute":"สำนักอนามัย","institute_id":2, + "catetory":"สำนักอนามัย","catetory_id":2, "start":"2023-11-05T09:00:00", "title":"สอบครั้งที่ 1/2565", "detail":"สอบเป็นลูกจ้างและผู้ปฎิบัติงานในกรุงเทพมหานคร เป็นข้าราชการกรุงเทพมหานคร", - "img":"/images/sel1.png", - "docUrl":"https://webportal.bangkok.go.th/public/user_files_editor/305/%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B8%81%E0%B8%B2%E0%B8%A8%E0%B8%84%E0%B8%B1%E0%B8%94%E0%B9%80%E0%B8%A5%E0%B8%B7%E0%B8%AD%E0%B8%81%E0%B8%A5%E0%B8%B9%E0%B8%81%E0%B8%88%E0%B9%89%E0%B8%B2%E0%B8%87.pdf" + "images":[ + { + "title":"topic", + "url":"/images/sel1.png" + } + ] }, { "id":"17", - "date":"1 พ.ย. 2566","institute":"สำนักงาน ก.ก.","institute_id":1, + "catetory":"สำนักงาน ก.ก.","catetory_id":1, "start":"2023-11-01", "title":"รับสมัครสอบตำแหน่งลูกจ้างและผู้ปฎิบัติงาน 1/2565", "detail":"รับสมัครสอบตำแหน่ง ลูกจ้างและผู้ปฎิบัติงานในกรุงเทพมหานคร เป็นข้าราชการกรุงเทพมหานคร", - "img":"/images/sel2.png", - "docUrl":"https://webportal.bangkok.go.th/public/user_files_editor/305/%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B8%81%E0%B8%B2%E0%B8%A8%E0%B8%84%E0%B8%B1%E0%B8%94%E0%B9%80%E0%B8%A5%E0%B8%B7%E0%B8%AD%E0%B8%81%E0%B8%A5%E0%B8%B9%E0%B8%81%E0%B8%88%E0%B9%89%E0%B8%B2%E0%B8%87.pdf" + "images":[ + { + "title":"topic", + "url":"/images/sel2.png" + } + ] } ] \ No newline at end of file diff --git a/cms/src/routes/+layout.svelte b/cms/src/routes/+layout.svelte index 8e1bb5f..4eb6a7c 100644 --- a/cms/src/routes/+layout.svelte +++ b/cms/src/routes/+layout.svelte @@ -9,7 +9,6 @@ dayjs.extend(buddhistEra) import type { LayoutData } from './$types'; export let data: LayoutData; - console.log(data) let {logo_url,supervised,divisions,institutes,address,organization} = data diff --git a/cms/src/routes/+page.server.ts b/cms/src/routes/+page.server.ts index f5232b9..66574fe 100644 --- a/cms/src/routes/+page.server.ts +++ b/cms/src/routes/+page.server.ts @@ -18,14 +18,17 @@ export const load: PageServerLoad = async ({fetch}) => { if(res.ok){ qualify_exams = await res.json() qualify_exams.forEach((e)=>{ - e.start? dayjs(e.start).format("DD MMM BBBB"):"" + e.date = e.start? dayjs(e.start).format("DD MMM BBBB"):"" }) + for(let i=qualify_exams.length;i<3;i++){ + qualify_exams.push({id:"0",title:"",date:"",image:""}) + } } res = await fetch("/api/competitive") if(res.ok){ competitive_exams = await res.json() competitive_exams.forEach((e)=>{ - e.start? dayjs(e.start).format("DD MMM BBBB"):"" + e.date = e.start? dayjs(e.start).format("DD MMM BBBB"):"" }) } return { content,image, qualify_exams,competitive_exams }; diff --git a/cms/src/routes/+page.svelte b/cms/src/routes/+page.svelte index 1d7bf15..76a00fb 100644 --- a/cms/src/routes/+page.svelte +++ b/cms/src/routes/+page.svelte @@ -82,7 +82,7 @@ >
- 1 + 1
@@ -120,7 +120,7 @@
- 1 + 1

@@ -155,7 +155,7 @@
- 1 + 1
@@ -212,7 +212,7 @@
- 1 + 1
@@ -251,7 +251,7 @@
- 1 + 1

@@ -286,7 +286,7 @@
- 1 + 1
diff --git a/cms/src/routes/api/competitive/+server.ts b/cms/src/routes/api/competitive/+server.ts index 2a667a9..24f3248 100644 --- a/cms/src/routes/api/competitive/+server.ts +++ b/cms/src/routes/api/competitive/+server.ts @@ -1,6 +1,19 @@ -import type {RequestHandler } from './$types' import {json} from '@sveltejs/kit' +import type {Exam} from '$lib/data/CMSDataType' import exams from "$lib/data/competitive-exam.json" -export const GET: RequestHandler = async () => { - return json(exams) +import type { RequestEvent,RequestHandler } from './$types' +export const GET: RequestHandler = async ({url}: RequestEvent) => { + const limit= Number(url.searchParams.get("limit")) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + let ex:Exam[] = exams.map(({files,images,detail,...minimal})=>{ + if(images && images[0]){ + const image = images[0].url + return {...minimal,image} + } + return minimal + }) + if(limit>0){ + ex = exams.slice(0,limit) + } + return json(ex) } \ No newline at end of file diff --git a/cms/src/routes/api/dev/+server.ts b/cms/src/routes/api/dev/+server.ts new file mode 100644 index 0000000..5787096 --- /dev/null +++ b/cms/src/routes/api/dev/+server.ts @@ -0,0 +1,8 @@ +import ver from "$lib/ver.json" +import {json} from '@sveltejs/kit' +import type { RequestHandler } from './$types' +export const GET: RequestHandler = async () => { + const version = ver.version + const builddate = ver.builddate + return json({version,builddate}) +} \ No newline at end of file diff --git a/cms/src/routes/api/info/+server.ts b/cms/src/routes/api/info/+server.ts index cdaf637..d8998b1 100644 --- a/cms/src/routes/api/info/+server.ts +++ b/cms/src/routes/api/info/+server.ts @@ -1,9 +1,6 @@ -import ver from "$lib/ver.json" import {json} from '@sveltejs/kit' import info from "$lib/data/info.json" import type { RequestHandler } from './$types' export const GET: RequestHandler = async () => { - const version = ver.version - const builddate = ver.builddate - return json({...info,version,builddate}) + return json(info) } \ No newline at end of file diff --git a/cms/src/routes/api/qualifying/+server.ts b/cms/src/routes/api/qualifying/+server.ts index 9d6bc00..527b1dd 100644 --- a/cms/src/routes/api/qualifying/+server.ts +++ b/cms/src/routes/api/qualifying/+server.ts @@ -1,6 +1,19 @@ -import type { RequestHandler } from './$types' import {json} from '@sveltejs/kit' +import type {Exam} from '$lib/data/CMSDataType' import exams from "$lib/data/qualify-exam.json" -export const GET: RequestHandler = async () => { - return json(exams) +import type { RequestEvent,RequestHandler } from './$types' +export const GET: RequestHandler = async ({url}: RequestEvent) => { + const limit= Number(url.searchParams.get("limit")) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + let ex:Exam[] = exams.map(({files,images,detail,...minimal})=>{ + if(images && images[0]){ + const image = images[0].url + return {...minimal,image} + } + return minimal + }) + if(limit>0){ + ex = exams.slice(0,limit) + } + return json(ex) } \ No newline at end of file diff --git a/cms/src/routes/competitive/+page.server.ts b/cms/src/routes/competitive/+page.server.ts index d7c2c60..14263de 100644 --- a/cms/src/routes/competitive/+page.server.ts +++ b/cms/src/routes/competitive/+page.server.ts @@ -1,6 +1,7 @@ -import type { PageServerLoad } from './$types' +import { error } from '@sveltejs/kit'; import type {CalendarEvent,Exam} from '$lib/data/CMSDataType' import dayjs from 'dayjs' +import type { PageServerLoad } from './$types' export const load: PageServerLoad = async ({fetch}) => { let content = "" let exams:Exam[] = [] @@ -10,9 +11,10 @@ export const load: PageServerLoad = async ({fetch}) => { } res = await fetch("/api/competitive") - if(res.ok){ - exams = await res.json() + if(!res.ok){ + throw error(res.status, 'ไม่สามารถอ่านข้อมูลการสอบได้'); } + exams = await res.json() const events:CalendarEvent[]=[] exams.forEach((e)=>{ diff --git a/cms/src/routes/qualifying/+page.server.ts b/cms/src/routes/qualifying/+page.server.ts index 010c191..ed0f363 100644 --- a/cms/src/routes/qualifying/+page.server.ts +++ b/cms/src/routes/qualifying/+page.server.ts @@ -1,4 +1,5 @@ +import { error } from '@sveltejs/kit'; import type {CalendarEvent,Exam} from '$lib/data/CMSDataType' import dayjs from 'dayjs' import type { PageServerLoad } from './$types' @@ -10,16 +11,18 @@ export const load: PageServerLoad = async ({fetch}) => { content = (await res.json()).content } res = await fetch("/api/qualifying") - if(res.ok){ - exams = await res.json() + if(!res.ok){ + throw error(res.status, 'ไม่สามารถอ่านข้อมูลการสอบได้'); } + exams = await res.json() + const events:CalendarEvent[]=[] exams.forEach((e)=>{ if(!e.start){ e.date="" return } - e.date= dayjs(e.start).format("DD MMM BBBB") + e.date = e.start? dayjs(e.start).format("DD MMM BBBB"):"" const {id,title,start,end,category_id} = e let backgroundColor ="" switch (category_id) {