forked from izu/student-web-if-development-kit
Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0d514efc10 | |||
| 81a260c4ed | |||
| 0dd0ff488a | |||
| 0fea8bddb1 | |||
| e1086f0223 | |||
| 709e455b51 | |||
| 86de53de2a | |||
| ff223ea289 | |||
| 034c958909 | |||
| c87e4eba3d | |||
| 0cd144673c | |||
| af8a3f6a98 | |||
| 54a317d147 | |||
| 00611a921b | |||
| d772f4573b | |||
| 3d2f0b23ad | |||
| e18641ff52 | |||
| f5dfb68bcc | |||
| 1a90411509 | |||
| 9755149741 | |||
| afe51be562 | |||
| 06fcc936e5 | |||
| 7957e6d50f |
@@ -646,6 +646,9 @@ const translations = {
|
|||||||
"Lulusan Informatika UNTAN bukan hanya pencari kerja — mereka pencipta solusi.",
|
"Lulusan Informatika UNTAN bukan hanya pencari kerja — mereka pencipta solusi.",
|
||||||
grp_jellyfish_career_desc:
|
grp_jellyfish_career_desc:
|
||||||
"Lulusan Prodi Informatika UNTAN diserap secara luas oleh industri teknologi, instansi pemerintah, BUMN, dan startup. Dengan bekal kompetensi digital yang kuat, karir cemerlang menanti di berbagai sektor strategis.",
|
"Lulusan Prodi Informatika UNTAN diserap secara luas oleh industri teknologi, instansi pemerintah, BUMN, dan startup. Dengan bekal kompetensi digital yang kuat, karir cemerlang menanti di berbagai sektor strategis.",
|
||||||
|
grp_jellyfish_industri: "Perusahaan Swasta & Korporasi",
|
||||||
|
grp_jellyfish_pemerintah: "Pemerintah & Instansi Publik",
|
||||||
|
grp_jellyfish_perguruan_tinggi: "Pendidikan, Organisasi & Lembaga Sosial",
|
||||||
|
|
||||||
grp_jellyfish_alumni_badge: "Alumni",
|
grp_jellyfish_alumni_badge: "Alumni",
|
||||||
grp_jellyfish_alumni_title: "Kisah Sukses Alumni",
|
grp_jellyfish_alumni_title: "Kisah Sukses Alumni",
|
||||||
@@ -656,6 +659,33 @@ const translations = {
|
|||||||
grp_jellyfish_infra_title: "Infrastruktur dan Fasilitas",
|
grp_jellyfish_infra_title: "Infrastruktur dan Fasilitas",
|
||||||
grp_jellyfish_infra_subtitle:
|
grp_jellyfish_infra_subtitle:
|
||||||
"Fasilitas lengkap dan modern untuk mendukung proses belajar, penelitian, dan inovasi mahasiswa.",
|
"Fasilitas lengkap dan modern untuk mendukung proses belajar, penelitian, dan inovasi mahasiswa.",
|
||||||
|
grp_jellyfish_pemerintah: "Instansi Pemerintah",
|
||||||
|
grp_jellyfish_perguruan_tinggi: "Perguruan Tinggi & Lembaga Riset",
|
||||||
|
grp_jellyfish_mitra_pln: "Pembuatan aplikasi monitoring BBM untuk PLN Nusantara Power UP Kapuas (2025).",
|
||||||
|
grp_jellyfish_mitra_diskominfo_kalbar: "Kerja sama dengan Diskominfo Kalbar untuk kerja praktek dan magang 2024-sekarang.",
|
||||||
|
grp_jellyfish_mitra_polda: "Penyelenggaraan CAT (Computer Assesment Test).",
|
||||||
|
grp_jellyfish_mitra_bappeda_sambas: "Pemutakhiran Geoportal Kabupaten Sambas pada infrastruktur Sambas GO.ID (2024).",
|
||||||
|
grp_jellyfish_mitra_bappeda_sintang: "Penyusunan Rencana Induk Sistem Informasi Geospasial kabupaten Sintang 2019, dan Kajian Analisa Dampak Lingkungan TPA dan IPLT.",
|
||||||
|
grp_jellyfish_mitra_bappeda_bengkayang: "Pembangunan Sistem Informasi Perencanaan Pembangunan Berbasis Data Geospasial dan Pendampingan Penyelenggaraan Informasi Geospasial Bagi Pemerintahan Daerah/Simpul Jaringan 2022.",
|
||||||
|
grp_jellyfish_mitra_bkpsdm: "Pengembangan dan pemeliharaan aplikasi E-Kinerja untuk manajemen kinerja aparatur sipil negara (2024).",
|
||||||
|
grp_jellyfish_mitra_bpbd_sintang: "Pembuatan peta potensi daerah rawan bencana banjir Kabupaten Sintang sebagai referensi mitigasi (2022).",
|
||||||
|
grp_jellyfish_mitra_bkd_pontianak: "Pengadaan Peta GIS PBB-P2 Tahap II untuk pengelolaan data pajak bumi dan bangunan Kota Pontianak (2022).",
|
||||||
|
grp_jellyfish_mitra_disperkim_singkawang: "Review baseline dan pemetaan kawasan permukiman kumuh Kota Singkawang (2020).",
|
||||||
|
grp_jellyfish_mitra_diskominfo_singkawang: "Kerja sama dengan Diskominfo Singkawang untuk kerja praktek dan magang 2024-sekarang.",
|
||||||
|
grp_jellyfish_mitra_diskominfo_pontianak: "Kerja sama dengan Diskominfo Pontianak untuk kerja praktek dan magang 2024-sekarang.",
|
||||||
|
grp_jellyfish_mitra_balitbang: "Pengembangan Dan Pemanfaatan Informasi Geospasial untuk Kelitbangan di Provinsi Kalbar.",
|
||||||
|
grp_jellyfish_mitra_unimas: "Kerja sama pelaksanaan Study Excursion 2019-2025.",
|
||||||
|
grp_jellyfish_mitra_uum: "Kerja sama menyelenggarakan konferensi internasional (ICODSE) - 2019.",
|
||||||
|
grp_jellyfish_mitra_ucs: "Kerja sama menyelenggarakan konferensi internasional (ICODSE) - 2019.",
|
||||||
|
grp_jellyfish_mitra_utem: "Kerjasama penyelenggaraan konferensi nasional.",
|
||||||
|
grp_jellyfish_mitra_ipb: "Kerja sama menyelenggarakan konferensi internasional (ICODSE) - 2019.",
|
||||||
|
grp_jellyfish_mitra_polnep: "Kerja sama dengan Politeknik Negeri Pontianak untuk kerja praktek dan magang 2024-sekarang.",
|
||||||
|
grp_jellyfish_mitra_poltekkes: "Rancangan kerja sama program Informatika dengan Politeknik Kesehatan Kemenkes Pontianak (2025).",
|
||||||
|
|
||||||
|
grp_limaem_hero_badge: "KOMUNITAS & KEPEMIMPINAN",
|
||||||
|
grp_limaem_hero_title: "Kehidupan Mahasiswa & <span style=\"color:#f5c82f;\">Himpunan (HMIF)</span>",
|
||||||
|
grp_limaem_hero_desc: "Membangun ekosistem kolaboratif di mana teknologi bertemu dengan kreativitas, membentuk calon pemimpin industri masa depan.",
|
||||||
|
grp_limaem_hero_btn: "Lihat Struktur Kepengurusan",
|
||||||
|
|
||||||
grp_jellyfish_partner_badge: "Kerjasama",
|
grp_jellyfish_partner_badge: "Kerjasama",
|
||||||
grp_jellyfish_partner_title: "Mitra Strategis Informatika UNTAN",
|
grp_jellyfish_partner_title: "Mitra Strategis Informatika UNTAN",
|
||||||
@@ -1203,8 +1233,8 @@ const translations = {
|
|||||||
grp_m4n1fest_hero_stat_alumni: "TOTAL ALUMNI",
|
grp_m4n1fest_hero_stat_alumni: "TOTAL ALUMNI",
|
||||||
grp_m4n1fest_hero_stat_alumni_desc:
|
grp_m4n1fest_hero_stat_alumni_desc:
|
||||||
"data diperoleh dari alumni terdata di tracer study",
|
"data diperoleh dari alumni terdata di tracer study",
|
||||||
grp_m4n1fest_hero_stat_batch: "ANGKATAN",
|
grp_m4n1fest_hero_stat_batch: "TOTAL ANGKATAN",
|
||||||
grp_m4n1fest_hero_stat_company: "PERUSAHAAN",
|
grp_m4n1fest_hero_stat_company: "TOTAL PERUSAHAAN",
|
||||||
grp_m4n1fest_eyebrow_achievers: "High Achievers",
|
grp_m4n1fest_eyebrow_achievers: "High Achievers",
|
||||||
grp_m4n1fest_title_achievers: "Alumni <em>Informatika</em>",
|
grp_m4n1fest_title_achievers: "Alumni <em>Informatika</em>",
|
||||||
grp_m4n1fest_sub_achievers:
|
grp_m4n1fest_sub_achievers:
|
||||||
@@ -1256,7 +1286,7 @@ const translations = {
|
|||||||
grp_m4n1fest_skill_not_listed: "Belum Terdata di Sini?",
|
grp_m4n1fest_skill_not_listed: "Belum Terdata di Sini?",
|
||||||
grp_m4n1fest_skill_not_listed_desc:
|
grp_m4n1fest_skill_not_listed_desc:
|
||||||
"Bantu kami melengkapi database skill alumni Informatika UNTAN. Kontribusikan data keahlian Anda untuk memetakan potensi nyata dari lulusan di berbagai sektor industri.",
|
"Bantu kami melengkapi database skill alumni Informatika UNTAN. Kontribusikan data keahlian Anda untuk memetakan potensi nyata dari lulusan di berbagai sektor industri.",
|
||||||
grp_m4n1fest_skill_btn_contrib: "Isi Form Kontribusi",
|
grp_m4n1fest_skill_btn_contrib: "Isi Form",
|
||||||
grp_m4n1fest_eyebrow_stats: "Statistik Alumni",
|
grp_m4n1fest_eyebrow_stats: "Statistik Alumni",
|
||||||
grp_m4n1fest_title_stats:
|
grp_m4n1fest_title_stats:
|
||||||
"Jumlah Alumni <em>berdasarkan Tahun Kelulusan</em>",
|
"Jumlah Alumni <em>berdasarkan Tahun Kelulusan</em>",
|
||||||
@@ -1265,6 +1295,11 @@ const translations = {
|
|||||||
grp_m4n1fest_table_head_period: "Periode",
|
grp_m4n1fest_table_head_period: "Periode",
|
||||||
grp_m4n1fest_table_head_amount: "Jumlah",
|
grp_m4n1fest_table_head_amount: "Jumlah",
|
||||||
grp_m4n1fest_table_source: "Sumber : BAK UNTAN",
|
grp_m4n1fest_table_source: "Sumber : BAK UNTAN",
|
||||||
|
grp_m4n1fest_table_p1: "2024 Genap",
|
||||||
|
grp_m4n1fest_table_p2: "2024 Ganjil",
|
||||||
|
grp_m4n1fest_table_p3: "2023 Genap",
|
||||||
|
grp_m4n1fest_table_p4: "2023 Ganjil",
|
||||||
|
grp_m4n1fest_table_p5: "2022 Genap",
|
||||||
grp_m4n1fest_chart_title: "Grafik Jumlah Lulusan",
|
grp_m4n1fest_chart_title: "Grafik Jumlah Lulusan",
|
||||||
grp_m4n1fest_eyebrow_testi: "Testimoni Alumni",
|
grp_m4n1fest_eyebrow_testi: "Testimoni Alumni",
|
||||||
grp_m4n1fest_title_testi: "Kata Mereka tentang <em>Informatika UNTAN</em>",
|
grp_m4n1fest_title_testi: "Kata Mereka tentang <em>Informatika UNTAN</em>",
|
||||||
@@ -1278,7 +1313,7 @@ const translations = {
|
|||||||
grp_m4n1fest_testi3_text:
|
grp_m4n1fest_testi3_text:
|
||||||
'"Fondasi yang kita peroleh dari kampus dan Himpunan merupakan wadah terbaik untuk belajar ketangguhan. Jadikanlah pengalaman tersebut sebagai sarana untuk terus terbuka terhadap perubahan. Jika kita mampu beradaptasi dengan baik, batas kemampuan kita tidak lagi ditentukan oleh geografi, melainkan seberapa jauh kita berani melangkah."',
|
'"Fondasi yang kita peroleh dari kampus dan Himpunan merupakan wadah terbaik untuk belajar ketangguhan. Jadikanlah pengalaman tersebut sebagai sarana untuk terus terbuka terhadap perubahan. Jika kita mampu beradaptasi dengan baik, batas kemampuan kita tidak lagi ditentukan oleh geografi, melainkan seberapa jauh kita berani melangkah."',
|
||||||
grp_m4n1fest_testi3_role:
|
grp_m4n1fest_testi3_role:
|
||||||
"Dosen Tetap, UMP & Peneliti, Universidad de Granada",
|
"Dosen Tetap, UMP & Peneliti, Universidad de Granada · Angkatan 2005",
|
||||||
grp_m4n1fest_eyebrow_events: "Kegiatan Tahunan",
|
grp_m4n1fest_eyebrow_events: "Kegiatan Tahunan",
|
||||||
grp_m4n1fest_title_events: "Temui Kami di <em>Setiap Tahun</em>",
|
grp_m4n1fest_title_events: "Temui Kami di <em>Setiap Tahun</em>",
|
||||||
grp_m4n1fest_sub_events:
|
grp_m4n1fest_sub_events:
|
||||||
@@ -1289,7 +1324,7 @@ const translations = {
|
|||||||
"SKBI Ramadhan adalah acara silaturahmi yang mempertemukan seluruh keluarga besar Informatika UNTAN — mahasiswa aktif, dosen, dan alumni dari berbagai angkatan. Kegiatan ini menjadi momen silaturahmi yang hangat di bulan Ramadhan, mempererat tali persaudaraan alumni dengan civitas akademika melalui kegiatan sosial, buka bersama, dan networking.",
|
"SKBI Ramadhan adalah acara silaturahmi yang mempertemukan seluruh keluarga besar Informatika UNTAN — mahasiswa aktif, dosen, dan alumni dari berbagai angkatan. Kegiatan ini menjadi momen silaturahmi yang hangat di bulan Ramadhan, mempererat tali persaudaraan alumni dengan civitas akademika melalui kegiatan sosial, buka bersama, dan networking.",
|
||||||
grp_m4n1fest_event1_note: "Info lengkap di Instagram HMIF",
|
grp_m4n1fest_event1_note: "Info lengkap di Instagram HMIF",
|
||||||
grp_m4n1fest_event2_title: "INFORMERS",
|
grp_m4n1fest_event2_title: "INFORMERS",
|
||||||
grp_m4n1fest_event2_meta: "Informatic Anniversary",
|
grp_m4n1fest_event2_meta: "HUT Informatika",
|
||||||
grp_m4n1fest_event2_desc:
|
grp_m4n1fest_event2_desc:
|
||||||
"INFORMERS adalah perayaan Hari Ulang Tahun Program Studi Informatika UNTAN. Acara besar ini mewadahi berbagai kegiatan kompetisi akademik maupun non-akademik tingkat mahasiswa, pameran inovasi IT, hiburan musik, hingga malam puncak yang mengumpulkan seluruh civitas akademika dan alumni dalam semangat dedikasi dan kebersamaan.",
|
"INFORMERS adalah perayaan Hari Ulang Tahun Program Studi Informatika UNTAN. Acara besar ini mewadahi berbagai kegiatan kompetisi akademik maupun non-akademik tingkat mahasiswa, pameran inovasi IT, hiburan musik, hingga malam puncak yang mengumpulkan seluruh civitas akademika dan alumni dalam semangat dedikasi dan kebersamaan.",
|
||||||
grp_m4n1fest_event2_note: "Pantau IG untuk jadwal & cara daftar",
|
grp_m4n1fest_event2_note: "Pantau IG untuk jadwal & cara daftar",
|
||||||
@@ -1325,9 +1360,11 @@ const translations = {
|
|||||||
grp_m4n1fest_form_status_opt5: "Mencari Kerja",
|
grp_m4n1fest_form_status_opt5: "Mencari Kerja",
|
||||||
grp_m4n1fest_form_instansi:
|
grp_m4n1fest_form_instansi:
|
||||||
'Tempat Bekerja / Instansi <span class="text-xs text-slate-400 font-normal">(opsional)</span>',
|
'Tempat Bekerja / Instansi <span class="text-xs text-slate-400 font-normal">(opsional)</span>',
|
||||||
|
grp_m4n1fest_form_instansi_placeholder: "Contoh: PT. Telkom Indonesia, Google...",
|
||||||
grp_m4n1fest_form_skill_title: "3 Skill Utama yang Dikuasai *",
|
grp_m4n1fest_form_skill_title: "3 Skill Utama yang Dikuasai *",
|
||||||
grp_m4n1fest_form_skill_sub: "Pilih 3 skill yang paling kamu kuasai.",
|
grp_m4n1fest_form_skill_sub: "Pilih 3 skill yang paling kamu kuasai.",
|
||||||
grp_m4n1fest_form_skill_opt1: "— Pilih —",
|
grp_m4n1fest_form_skill_opt1: "— Pilih —",
|
||||||
|
grp_m4n1fest_form_skill_others: "Lainnya",
|
||||||
grp_m4n1fest_form_persetujuan: "Persetujuan *",
|
grp_m4n1fest_form_persetujuan: "Persetujuan *",
|
||||||
grp_m4n1fest_form_persetujuan_txt:
|
grp_m4n1fest_form_persetujuan_txt:
|
||||||
"Saya menyetujui bahwa data yang saya masukkan adalah benar and bersedia diverifikasi oleh admin IKA Informatika UNTAN.",
|
"Saya menyetujui bahwa data yang saya masukkan adalah benar and bersedia diverifikasi oleh admin IKA Informatika UNTAN.",
|
||||||
@@ -2518,8 +2555,8 @@ const translations = {
|
|||||||
grp_m4n1fest_hero_stat_alumni: "TOTAL ALUMNI",
|
grp_m4n1fest_hero_stat_alumni: "TOTAL ALUMNI",
|
||||||
grp_m4n1fest_hero_stat_alumni_desc:
|
grp_m4n1fest_hero_stat_alumni_desc:
|
||||||
"data obtained from alumni recorded in tracer study",
|
"data obtained from alumni recorded in tracer study",
|
||||||
grp_m4n1fest_hero_stat_batch: "CLASSES",
|
grp_m4n1fest_hero_stat_batch: "TOTAL BATCHES",
|
||||||
grp_m4n1fest_hero_stat_company: "COMPANIES",
|
grp_m4n1fest_hero_stat_company: "TOTAL COMPANIES",
|
||||||
grp_m4n1fest_eyebrow_achievers: "High Achievers",
|
grp_m4n1fest_eyebrow_achievers: "High Achievers",
|
||||||
grp_m4n1fest_title_achievers: "Informatics <em>Alumni</em>",
|
grp_m4n1fest_title_achievers: "Informatics <em>Alumni</em>",
|
||||||
grp_m4n1fest_sub_achievers:
|
grp_m4n1fest_sub_achievers:
|
||||||
@@ -2573,7 +2610,7 @@ const translations = {
|
|||||||
grp_m4n1fest_skill_not_listed: "Not Listed Here Yet?",
|
grp_m4n1fest_skill_not_listed: "Not Listed Here Yet?",
|
||||||
grp_m4n1fest_skill_not_listed_desc:
|
grp_m4n1fest_skill_not_listed_desc:
|
||||||
"Help us complete the skill database of Informatics UNTAN alumni. Contribute your expertise data to map the true potential of graduates across various industrial sectors.",
|
"Help us complete the skill database of Informatics UNTAN alumni. Contribute your expertise data to map the true potential of graduates across various industrial sectors.",
|
||||||
grp_m4n1fest_skill_btn_contrib: "Fill Out Contribution Form",
|
grp_m4n1fest_skill_btn_contrib: "Fill Form",
|
||||||
grp_m4n1fest_eyebrow_stats: "Alumni Statistics",
|
grp_m4n1fest_eyebrow_stats: "Alumni Statistics",
|
||||||
grp_m4n1fest_title_stats: "Number of Alumni <em>by Graduation Year</em>",
|
grp_m4n1fest_title_stats: "Number of Alumni <em>by Graduation Year</em>",
|
||||||
grp_m4n1fest_sub_stats:
|
grp_m4n1fest_sub_stats:
|
||||||
@@ -2581,6 +2618,11 @@ const translations = {
|
|||||||
grp_m4n1fest_table_head_period: "Period",
|
grp_m4n1fest_table_head_period: "Period",
|
||||||
grp_m4n1fest_table_head_amount: "Amount",
|
grp_m4n1fest_table_head_amount: "Amount",
|
||||||
grp_m4n1fest_table_source: "Source: BAK UNTAN",
|
grp_m4n1fest_table_source: "Source: BAK UNTAN",
|
||||||
|
grp_m4n1fest_table_p1: "2024 Even",
|
||||||
|
grp_m4n1fest_table_p2: "2024 Odd",
|
||||||
|
grp_m4n1fest_table_p3: "2023 Even",
|
||||||
|
grp_m4n1fest_table_p4: "2023 Odd",
|
||||||
|
grp_m4n1fest_table_p5: "2022 Even",
|
||||||
grp_m4n1fest_chart_title: "Graduation Chart",
|
grp_m4n1fest_chart_title: "Graduation Chart",
|
||||||
grp_m4n1fest_eyebrow_testi: "Alumni Testimonials",
|
grp_m4n1fest_eyebrow_testi: "Alumni Testimonials",
|
||||||
grp_m4n1fest_title_testi: "What They Say About <em>Informatics UNTAN</em>",
|
grp_m4n1fest_title_testi: "What They Say About <em>Informatics UNTAN</em>",
|
||||||
@@ -2594,7 +2636,7 @@ const translations = {
|
|||||||
grp_m4n1fest_testi3_text:
|
grp_m4n1fest_testi3_text:
|
||||||
'"The foundation we obtain from the campus and Student Association is the best place to learn resilience. Make that experience a means to stay open to changes. If we are able to adapt well, our limits are no longer determined by geography, but how far we dare to step."',
|
'"The foundation we obtain from the campus and Student Association is the best place to learn resilience. Make that experience a means to stay open to changes. If we are able to adapt well, our limits are no longer determined by geography, but how far we dare to step."',
|
||||||
grp_m4n1fest_testi3_role:
|
grp_m4n1fest_testi3_role:
|
||||||
"Full-time Lecturer, UMP & Researcher, Universidad de Granada",
|
"Full-time Lecturer, UMP & Researcher, Universidad de Granada · Class of 2005",
|
||||||
grp_m4n1fest_eyebrow_events: "Annual Events",
|
grp_m4n1fest_eyebrow_events: "Annual Events",
|
||||||
grp_m4n1fest_title_events: "Meet Us <em>Every Year</em>",
|
grp_m4n1fest_title_events: "Meet Us <em>Every Year</em>",
|
||||||
grp_m4n1fest_sub_events:
|
grp_m4n1fest_sub_events:
|
||||||
@@ -2641,9 +2683,11 @@ const translations = {
|
|||||||
grp_m4n1fest_form_status_opt5: "Looking for a Job",
|
grp_m4n1fest_form_status_opt5: "Looking for a Job",
|
||||||
grp_m4n1fest_form_instansi:
|
grp_m4n1fest_form_instansi:
|
||||||
'Workplace / Institution <span class="text-xs text-slate-400 font-normal">(optional)</span>',
|
'Workplace / Institution <span class="text-xs text-slate-400 font-normal">(optional)</span>',
|
||||||
|
grp_m4n1fest_form_instansi_placeholder: "Example: PT. Telkom Indonesia, Google...",
|
||||||
grp_m4n1fest_form_skill_title: "3 Primary Skills Mastered *",
|
grp_m4n1fest_form_skill_title: "3 Primary Skills Mastered *",
|
||||||
grp_m4n1fest_form_skill_sub: "Select 3 skills you are most proficient in.",
|
grp_m4n1fest_form_skill_sub: "Select 3 skills you are most proficient in.",
|
||||||
grp_m4n1fest_form_skill_opt1: "— Select —",
|
grp_m4n1fest_form_skill_opt1: "— Select —",
|
||||||
|
grp_m4n1fest_form_skill_others: "Others",
|
||||||
grp_m4n1fest_form_persetujuan: "Consent *",
|
grp_m4n1fest_form_persetujuan: "Consent *",
|
||||||
grp_m4n1fest_form_persetujuan_txt:
|
grp_m4n1fest_form_persetujuan_txt:
|
||||||
"I agree that the data I entered is true and willing to be verified by the Informatics UNTAN IKA admin.",
|
"I agree that the data I entered is true and willing to be verified by the Informatics UNTAN IKA admin.",
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 644 KiB |
@@ -2709,10 +2709,10 @@
|
|||||||
href: "https://maps.app.goo.gl/386expVMhHgMAmXA9",
|
href: "https://maps.app.goo.gl/386expVMhHgMAmXA9",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
image: "images/hutan-mangrove.jpg",
|
image: "images/hutan-sylva.png",
|
||||||
nameKey: "skp_dest_mangrove_name",
|
nameKey: "skp_dest_mangrove_name",
|
||||||
descKey: "skp_dest_mangrove_desc",
|
descKey: "skp_dest_mangrove_desc",
|
||||||
href: "#",
|
href: "https://maps.app.goo.gl/ktWUMbxwHbWUfb4L8",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
image: "images/mujahidin.webp",
|
image: "images/mujahidin.webp",
|
||||||
|
|||||||
@@ -2,87 +2,119 @@
|
|||||||
const dict = {
|
const dict = {
|
||||||
id: {
|
id: {
|
||||||
// --- Hero Section ---
|
// --- Hero Section ---
|
||||||
skp_hero_desc: "Kuliah di kampus unggulan Kalimantan Barat dengan fasilitas lengkap, lingkungan nyaman dan kehidupan mahasiswa yang terjangkau",
|
skp_hero_desc:
|
||||||
|
"Kuliah di kampus unggulan Kalimantan Barat dengan fasilitas lengkap, lingkungan nyaman dan kehidupan mahasiswa yang terjangkau",
|
||||||
|
|
||||||
// --- About Section ---
|
// --- About Section ---
|
||||||
skp_about_eyebrow: "Tentang Untan",
|
skp_about_eyebrow: "Tentang Untan",
|
||||||
skp_about_title: "Kampus Unggul di Kalimantan Barat",
|
skp_about_title: "Kampus Unggul di Kalimantan Barat",
|
||||||
skp_about_desc_1: "Universitas Tanjungpura merupakan perguruan tinggi negeri terkemuka di Kalimantan Barat yang berkomitmen menghadirkan pendidikan berkualitas.",
|
skp_about_desc_1:
|
||||||
skp_about_desc_2: "UNTAN terus mendorong pengembangan riset, inovasi, dan kolaborasi di berbagai bidang.",
|
"Universitas Tanjungpura merupakan perguruan tinggi negeri terkemuka di Kalimantan Barat yang berkomitmen menghadirkan pendidikan berkualitas.",
|
||||||
skp_about_desc_3: "Didukung lingkungan belajar yang nyaman, mahasiswa memiliki ruang untuk berkembang secara akademik maupun nonakademik.",
|
skp_about_desc_2:
|
||||||
|
"UNTAN terus mendorong pengembangan riset, inovasi, dan kolaborasi di berbagai bidang.",
|
||||||
|
skp_about_desc_3:
|
||||||
|
"Didukung lingkungan belajar yang nyaman, mahasiswa memiliki ruang untuk berkembang secara akademik maupun nonakademik.",
|
||||||
skp_about_link_text: "Kunjungi Website Resmi",
|
skp_about_link_text: "Kunjungi Website Resmi",
|
||||||
|
|
||||||
// --- Facilities Section ---
|
// --- Facilities Section ---
|
||||||
skp_fac_eyebrow: "Fasilitas Kampus",
|
skp_fac_eyebrow: "Fasilitas Kampus",
|
||||||
skp_fac_main_title: "Fasilitas Kampus untuk Pengalaman Belajar yang Nyaman",
|
skp_fac_main_title:
|
||||||
|
"Fasilitas Kampus untuk Pengalaman Belajar yang Nyaman",
|
||||||
skp_fac_title_perpus: "Perpustakaan UNTAN",
|
skp_fac_title_perpus: "Perpustakaan UNTAN",
|
||||||
skp_fac_desc_perpus: "Koleksi literatur digital dan fisik terlengkap dengan ruang baca yang tenang dan modern.",
|
skp_fac_desc_perpus:
|
||||||
|
"Koleksi literatur digital dan fisik terlengkap dengan ruang baca yang tenang dan modern.",
|
||||||
skp_fac_title_rusunawa: "Rusunawa",
|
skp_fac_title_rusunawa: "Rusunawa",
|
||||||
skp_fac_desc_rusunawa: "Hunian mahasiswa yang aman, terjangkau, dan berlokasi strategis di dalam lingkungan kampus.",
|
skp_fac_desc_rusunawa:
|
||||||
|
"Hunian mahasiswa yang aman, terjangkau, dan berlokasi strategis di dalam lingkungan kampus.",
|
||||||
skp_fac_title_rs: "Rumah Sakit Untan & Klinik Pratama",
|
skp_fac_title_rs: "Rumah Sakit Untan & Klinik Pratama",
|
||||||
skp_fac_desc_rs: "Layanan kesehatan prima bagi seluruh sivitas akademika dengan tenaga medis profesional.",
|
skp_fac_desc_rs:
|
||||||
|
"Layanan kesehatan prima bagi seluruh sivitas akademika dengan tenaga medis profesional.",
|
||||||
skp_fac_title_gkb: "Gedung Kuliah Bersama",
|
skp_fac_title_gkb: "Gedung Kuliah Bersama",
|
||||||
skp_fac_desc_gkb: "Ruang kelas interaktif dengan dukungan teknologi multimedia terkini untuk proses belajar mengajar.",
|
skp_fac_desc_gkb:
|
||||||
|
"Ruang kelas interaktif dengan dukungan teknologi multimedia terkini untuk proses belajar mengajar.",
|
||||||
skp_fac_title_bahasa: "UPT Bahasa",
|
skp_fac_title_bahasa: "UPT Bahasa",
|
||||||
skp_fac_desc_bahasa: "Pusat pelatihan bahasa asing dan sertifikasi internasional untuk menunjang karir global.",
|
skp_fac_desc_bahasa:
|
||||||
|
"Pusat pelatihan bahasa asing dan sertifikasi internasional untuk menunjang karir global.",
|
||||||
skp_fac_title_olahraga: "Area Olahraga",
|
skp_fac_title_olahraga: "Area Olahraga",
|
||||||
skp_fac_desc_olahraga: "Fasilitas olahraga outdoor dan indoor lengkap untuk menjaga kebugaran dan menyalurkan bakat.",
|
skp_fac_desc_olahraga:
|
||||||
|
"Fasilitas olahraga outdoor dan indoor lengkap untuk menjaga kebugaran dan menyalurkan bakat.",
|
||||||
skp_fac_title_masjid: "Masjid Muhtadin UNTAN",
|
skp_fac_title_masjid: "Masjid Muhtadin UNTAN",
|
||||||
skp_fac_desc_masjid: "Pusat ibadah yang nyaman dan inklusif bagi sivitas akademika UNTAN dengan suasana religius yang menenangkan.",
|
skp_fac_desc_masjid:
|
||||||
|
"Pusat ibadah yang nyaman dan inklusif bagi sivitas akademika UNTAN dengan suasana religius yang menenangkan.",
|
||||||
skp_fac_title_lab: "Laboraturium Kampus UNTAN",
|
skp_fac_title_lab: "Laboraturium Kampus UNTAN",
|
||||||
skp_fac_desc_lab: "Fasilitas laboratorium modern UNTAN yang mendukung riset, praktikum, dan inovasi mahasiswa.",
|
skp_fac_desc_lab:
|
||||||
|
"Fasilitas laboratorium modern UNTAN yang mendukung riset, praktikum, dan inovasi mahasiswa.",
|
||||||
skp_fac_title_audit: "Auditorium UNTAN",
|
skp_fac_title_audit: "Auditorium UNTAN",
|
||||||
skp_fac_desc_audit: "Ruang serbaguna representatif UNTAN untuk seminar, acara akademik, dan kegiatan besar kampus.",
|
skp_fac_desc_audit:
|
||||||
|
"Ruang serbaguna representatif UNTAN untuk seminar, acara akademik, dan kegiatan besar kampus.",
|
||||||
|
|
||||||
// --- Campus Section ---
|
// --- Campus Section ---
|
||||||
skp_campus_eyebrow: "Kehidupan Kampus",
|
skp_campus_eyebrow: "Kehidupan Kampus",
|
||||||
skp_campus_title: "Aktivitas Mahasiswa & Organisasi Kampus",
|
skp_campus_title: "Aktivitas Mahasiswa & Organisasi Kampus",
|
||||||
skp_campus_subtitle: "Mahasiswa UNTAN memiliki berbagai kesempatan untuk berkembang melalui organisasi, UKM, komunitas, dan kegiatan ekstrakurikuler.",
|
skp_campus_subtitle:
|
||||||
|
"Mahasiswa UNTAN memiliki berbagai kesempatan untuk berkembang melalui organisasi, UKM, komunitas, dan kegiatan ekstrakurikuler.",
|
||||||
skp_campus_cat_org: "Organisasi",
|
skp_campus_cat_org: "Organisasi",
|
||||||
skp_campus_cat_ukm: "UKM",
|
skp_campus_cat_ukm: "UKM",
|
||||||
skp_campus_cat_com: "Komunitas",
|
skp_campus_cat_com: "Komunitas",
|
||||||
skp_campus_dir_bem_title: "BEM UNTAN",
|
skp_campus_dir_bem_title: "BEM UNTAN",
|
||||||
skp_campus_dir_bem_desc: "Badan Eksekutif Mahasiswa tingkat universitas yang menjadi wadah aspirasi dan pergerakan mahasiswa untuk perubahan positif di kampus.",
|
skp_campus_dir_bem_desc:
|
||||||
|
"Badan Eksekutif Mahasiswa tingkat universitas yang menjadi wadah aspirasi dan pergerakan mahasiswa untuk perubahan positif di kampus.",
|
||||||
skp_campus_dir_dpm_title: "DPM UNTAN",
|
skp_campus_dir_dpm_title: "DPM UNTAN",
|
||||||
skp_campus_dir_dpm_desc: "Dewan Perwakilan Mahasiswa yang menjalankan fungsi legislasi dan pengawasan terhadap kebijakan-kebijakan organisasi mahasiswa di universitas.",
|
skp_campus_dir_dpm_desc:
|
||||||
|
"Dewan Perwakilan Mahasiswa yang menjalankan fungsi legislasi dan pengawasan terhadap kebijakan-kebijakan organisasi mahasiswa di universitas.",
|
||||||
skp_campus_dir_hmif_title: "HMIF UNTAN",
|
skp_campus_dir_hmif_title: "HMIF UNTAN",
|
||||||
skp_campus_dir_hmif_desc: "Organisasi mahasiswa di bawah Program Studi Informatika yang menjadi wadah pengembangan akademik, kepemimpinan, dan jejaring bagi anggotanya.",
|
skp_campus_dir_hmif_desc:
|
||||||
|
"Organisasi mahasiswa di bawah Program Studi Informatika yang menjadi wadah pengembangan akademik, kepemimpinan, dan jejaring bagi anggotanya.",
|
||||||
skp_campus_dir_cafa_title: "CAFATIFA",
|
skp_campus_dir_cafa_title: "CAFATIFA",
|
||||||
skp_campus_dir_cafa_desc: "Organisasi ini menjadi wadah pelayanan, pembinaan iman, dan pengembangan karakter bagi mahasiswa Katolik di fakultas tersebut.",
|
skp_campus_dir_cafa_desc:
|
||||||
|
"Organisasi ini menjadi wadah pelayanan, pembinaan iman, dan pengembangan karakter bagi mahasiswa Katolik di fakultas tersebut.",
|
||||||
skp_campus_dir_mapala_title: "MAPALA UNTAN",
|
skp_campus_dir_mapala_title: "MAPALA UNTAN",
|
||||||
skp_campus_dir_mapala_desc: "Wadah pecinta alam mahasiswa UNTAN yang membentuk karakter tangguh, peduli lingkungan, dan berjiwa petualang.",
|
skp_campus_dir_mapala_desc:
|
||||||
|
"Wadah pecinta alam mahasiswa UNTAN yang membentuk karakter tangguh, peduli lingkungan, dan berjiwa petualang.",
|
||||||
skp_campus_dir_lisma_title: "LISMA UNTAN",
|
skp_campus_dir_lisma_title: "LISMA UNTAN",
|
||||||
skp_campus_dir_lisma_desc: "Wadah mahasiswa yang mengembangkan minat literasi, diskusi, dan pemikiran kritis secara kolaboratif.",
|
skp_campus_dir_lisma_desc:
|
||||||
|
"Wadah mahasiswa yang mengembangkan minat literasi, diskusi, dan pemikiran kritis secara kolaboratif.",
|
||||||
skp_campus_dir_lsmi_title: "LSMI UNTAN",
|
skp_campus_dir_lsmi_title: "LSMI UNTAN",
|
||||||
skp_campus_dir_lsmi_desc: "Unit kegiatan mahasiswa yang mewadahi pembinaan keagamaan, dakwah, dan pengembangan spiritual mahasiswa.",
|
skp_campus_dir_lsmi_desc:
|
||||||
|
"Unit kegiatan mahasiswa yang mewadahi pembinaan keagamaan, dakwah, dan pengembangan spiritual mahasiswa.",
|
||||||
skp_campus_dir_semut_title: "SARANG SEMUT",
|
skp_campus_dir_semut_title: "SARANG SEMUT",
|
||||||
skp_campus_dir_semut_desc: "Komunitas mahasiswa yang menumbuhkan budaya literasi, diskusi kritis, dan pemikiran intelektual di lingkungan kampus.",
|
skp_campus_dir_semut_desc:
|
||||||
|
"Komunitas mahasiswa yang menumbuhkan budaya literasi, diskusi kritis, dan pemikiran intelektual di lingkungan kampus.",
|
||||||
skp_campus_dir_aiesec_title: "AIESEC",
|
skp_campus_dir_aiesec_title: "AIESEC",
|
||||||
skp_campus_dir_aiesec_desc: "Organisasi kepemudaan internasional di UNTAN yang mengembangkan kepemimpinan, pengalaman global, dan kolaborasi lintas budaya mahasiswa.",
|
skp_campus_dir_aiesec_desc:
|
||||||
|
"Organisasi kepemudaan internasional di UNTAN yang mengembangkan kepemimpinan, pengalaman global, dan kolaborasi lintas budaya mahasiswa.",
|
||||||
|
|
||||||
// --- Pontianak City Section ---
|
// --- Pontianak City Section ---
|
||||||
skp_pontianak_eyebrow: "Kota Pontianak",
|
skp_pontianak_eyebrow: "Kota Pontianak",
|
||||||
skp_pontianak_title: "Live In Pontianak",
|
skp_pontianak_title: "Live In Pontianak",
|
||||||
skp_pontianak_desc: "Pontianak bukan sekadar ibu kota Kalimantan Barat, tetapi tempat yang nyaman untuk tinggal, ramah bagi mahasiswa, dan bersahabat di kantong. Kota ini menawarkan akses fasilitas umum yang lengkap, ragam kuliner yang menggoda, serta suasana belajar yang aktif dan penuh semangat.",
|
skp_pontianak_desc:
|
||||||
|
"Pontianak bukan sekadar ibu kota Kalimantan Barat, tetapi tempat yang nyaman untuk tinggal, ramah bagi mahasiswa, dan bersahabat di kantong. Kota ini menawarkan akses fasilitas umum yang lengkap, ragam kuliner yang menggoda, serta suasana belajar yang aktif dan penuh semangat.",
|
||||||
|
|
||||||
// --- Destination Section ---
|
// --- Destination Section ---
|
||||||
skp_dest_eyebrow: "Wisata & Destinasi",
|
skp_dest_eyebrow: "Wisata & Destinasi",
|
||||||
skp_dest_title: "Tempat Menarik di Pontianak",
|
skp_dest_title: "Tempat Menarik di Pontianak",
|
||||||
skp_dest_open_maps: "Buka Peta",
|
skp_dest_open_maps: "Buka Peta",
|
||||||
skp_dest_khatulistiwa_name: "Tugu Khatulistiwa",
|
skp_dest_khatulistiwa_name: "Tugu Khatulistiwa",
|
||||||
skp_dest_khatulistiwa_desc: "Ikon kota yang menandakan posisi garis lintang nol derajat di bumi.",
|
skp_dest_khatulistiwa_desc:
|
||||||
|
"Ikon kota yang menandakan posisi garis lintang nol derajat di bumi.",
|
||||||
skp_dest_waterfront_name: "Waterfront",
|
skp_dest_waterfront_name: "Waterfront",
|
||||||
skp_dest_waterfront_desc: "Area pedestrian tepi sungai Kapuas yang populer untuk menikmati senja.",
|
skp_dest_waterfront_desc:
|
||||||
|
"Area pedestrian tepi sungai Kapuas yang populer untuk menikmati senja.",
|
||||||
skp_dest_qubu_name: "Qubu Resort",
|
skp_dest_qubu_name: "Qubu Resort",
|
||||||
skp_dest_qubu_desc: "Kawasan taman wisata terpadu dan resort bintang 4 di Kubu Raya.",
|
skp_dest_qubu_desc:
|
||||||
|
"Kawasan taman wisata terpadu dan resort bintang 4 di Kubu Raya.",
|
||||||
skp_dest_radank_name: "Rumah Radakng",
|
skp_dest_radank_name: "Rumah Radakng",
|
||||||
skp_dest_radank_desc: "Rumah adat suku Dayak dan merupakan simbol harmoni budaya.",
|
skp_dest_radank_desc:
|
||||||
|
"Rumah adat suku Dayak dan merupakan simbol harmoni budaya.",
|
||||||
skp_dest_museum_name: "Museum",
|
skp_dest_museum_name: "Museum",
|
||||||
skp_dest_museum_desc: "Koleksi Geografika/Geologika berupa peta dan jenis batu-batuan.",
|
skp_dest_museum_desc:
|
||||||
|
"Koleksi Geografika/Geologika berupa peta dan jenis batu-batuan.",
|
||||||
skp_dest_amalzone_name: "Amalzone",
|
skp_dest_amalzone_name: "Amalzone",
|
||||||
skp_dest_amalzone_desc: "Destinasi wisata alam dan rekreasi keluarga yang populer.",
|
skp_dest_amalzone_desc:
|
||||||
skp_dest_mangrove_name: "Hutan Mangrove",
|
"Destinasi wisata alam dan rekreasi keluarga yang populer.",
|
||||||
skp_dest_mangrove_desc: "Pemandangan alami yang menakjubkan jalur trekking kayu.",
|
skp_dest_mangrove_name: "Hutan Sylva",
|
||||||
|
skp_dest_mangrove_desc:
|
||||||
|
"Pemandangan alami yang menakjubkan jalur trekking kayu.",
|
||||||
skp_dest_mujahidin_name: "Masjid Mujahidin",
|
skp_dest_mujahidin_name: "Masjid Mujahidin",
|
||||||
skp_dest_mujahidin_desc: "Masjid terbesar di Provinsi Kalimantan Barat.",
|
skp_dest_mujahidin_desc: "Masjid terbesar di Provinsi Kalimantan Barat.",
|
||||||
|
|
||||||
@@ -91,23 +123,35 @@
|
|||||||
skp_cul_title: "Kuliner dan Coffee Shop Favorit Mahasiswa",
|
skp_cul_title: "Kuliner dan Coffee Shop Favorit Mahasiswa",
|
||||||
skp_cul_cat_rm: "Rumah Makan",
|
skp_cul_cat_rm: "Rumah Makan",
|
||||||
skp_cul_cat_cs: "Coffee Shop",
|
skp_cul_cat_cs: "Coffee Shop",
|
||||||
skp_cul_gebuk_desc: "Ayam gepuk pedas gurih meresap, bikin nambah nasi terus.",
|
skp_cul_gebuk_desc:
|
||||||
skp_cul_sari_desc: "Masakan hangat rumahan menggoda, sekali coba langsung jatuh cinta.",
|
"Ayam gepuk pedas gurih meresap, bikin nambah nasi terus.",
|
||||||
|
skp_cul_sari_desc:
|
||||||
|
"Masakan hangat rumahan menggoda, sekali coba langsung jatuh cinta.",
|
||||||
skp_cul_mom_desc: "Menu rumahan enak dengan porsi besar.",
|
skp_cul_mom_desc: "Menu rumahan enak dengan porsi besar.",
|
||||||
skp_cul_shine_desc: "Nasi topping kekinian dengan tampilan menarik dan topping yang melimpah.",
|
skp_cul_shine_desc:
|
||||||
skp_cul_melepar_desc: "Ayam crispy gurih pedas favorit mahasiswa dengan ayam renyah pedas menggigit.",
|
"Nasi topping kekinian dengan tampilan menarik dan topping yang melimpah.",
|
||||||
skp_cul_umi_desc: "Ayam geprek pedas murah dan mengenyangkan dengan pedasnya nampol mantap.",
|
skp_cul_melepar_desc:
|
||||||
skp_cul_cw_desc: "CW Coffee awalnya berdiri pada tahun 2015 dengan nama Cyber World iCafe, sebuah kafe internet (warnet) berkecepatan tinggi yang buka 24 jam.",
|
"Ayam crispy gurih pedas favorit mahasiswa dengan ayam renyah pedas menggigit.",
|
||||||
skp_cul_nordu_desc: "NORDU Coffee & Eatery (populer dikenal sebagai Kopi Nomor Dua) menawarkan tempat yang nyaman untuk bekerja (Work From Home) dengan menu kopi dan hidangan yang ramah di kantong.",
|
skp_cul_umi_desc:
|
||||||
skp_cul_kami_desc: "Toko Kami didirikan pada November 2021 oleh seorang pemuda kreatif bernama Yudistira Nusantara. Nama 'Toko Kami' merupakan sebuah akronim dari Toko Kudapan dan Aneka Minuman Indonesia.",
|
"Ayam geprek pedas murah dan mengenyangkan dengan pedasnya nampol mantap.",
|
||||||
skp_cul_lokale_desc: "Lokale didirikan oleh Asmako pada tahun 2017. Berawal dari kecintaan pemiliknya terhadap racikan kopi, Lokale hadir untuk menciptakan cita rasa kopi modern yang pas dengan lidah masyarakat.",
|
skp_cul_cw_desc:
|
||||||
skp_cul_weng_desc: "Weng Coffee adalah salah satu legenda hidup warung kopi di Kota Khatulistiwa yang sudah berdiri sejak tahun 1970.",
|
"CW Coffee awalnya berdiri pada tahun 2015 dengan nama Cyber World iCafe, sebuah kafe internet (warnet) berkecepatan tinggi yang buka 24 jam.",
|
||||||
skp_cul_tropic_desc: "Tropic Cafe Pontianak merupakan salah satu pelopor coffee shop modern berskala besar di Pontianak yang mengusung konsep 24 jam nonstop dengan harga super ramah kantong.",
|
skp_cul_nordu_desc:
|
||||||
|
"NORDU Coffee & Eatery (populer dikenal sebagai Kopi Nomor Dua) menawarkan tempat yang nyaman untuk bekerja (Work From Home) dengan menu kopi dan hidangan yang ramah di kantong.",
|
||||||
|
skp_cul_kami_desc:
|
||||||
|
"Toko Kami didirikan pada November 2021 oleh seorang pemuda kreatif bernama Yudistira Nusantara. Nama 'Toko Kami' merupakan sebuah akronim dari Toko Kudapan dan Aneka Minuman Indonesia.",
|
||||||
|
skp_cul_lokale_desc:
|
||||||
|
"Lokale didirikan oleh Asmako pada tahun 2017. Berawal dari kecintaan pemiliknya terhadap racikan kopi, Lokale hadir untuk menciptakan cita rasa kopi modern yang pas dengan lidah masyarakat.",
|
||||||
|
skp_cul_weng_desc:
|
||||||
|
"Weng Coffee adalah salah satu legenda hidup warung kopi di Kota Khatulistiwa yang sudah berdiri sejak tahun 1970.",
|
||||||
|
skp_cul_tropic_desc:
|
||||||
|
"Tropic Cafe Pontianak merupakan salah satu pelopor coffee shop modern berskala besar di Pontianak yang mengusung konsep 24 jam nonstop dengan harga super ramah kantong.",
|
||||||
|
|
||||||
// --- Living Cost Section ---
|
// --- Living Cost Section ---
|
||||||
skp_cost_eyebrow: "Biaya Hidup Mahasiswa",
|
skp_cost_eyebrow: "Biaya Hidup Mahasiswa",
|
||||||
skp_cost_title: "Perkiraan Biaya Hidup Mahasiswa di Pontianak",
|
skp_cost_title: "Perkiraan Biaya Hidup Mahasiswa di Pontianak",
|
||||||
skp_cost_desc: "Perencanaan keuangan yang baik membantu mahasiswa menjalani masa studi dengan lebih nyaman di Pontianak.",
|
skp_cost_desc:
|
||||||
|
"Perencanaan keuangan yang baik membantu mahasiswa menjalani masa studi dengan lebih nyaman di Pontianak.",
|
||||||
skp_cost_note: "*Data yang didapat bersumber dari survey internal",
|
skp_cost_note: "*Data yang didapat bersumber dari survey internal",
|
||||||
skp_cost_period: "per bulan",
|
skp_cost_period: "per bulan",
|
||||||
skp_cost_type_home: "Hunian",
|
skp_cost_type_home: "Hunian",
|
||||||
@@ -116,112 +160,157 @@
|
|||||||
},
|
},
|
||||||
en: {
|
en: {
|
||||||
// --- Hero Section ---
|
// --- Hero Section ---
|
||||||
skp_hero_desc: "Study at the leading campus in West Kalimantan with complete facilities, comfortable environment, and affordable student life",
|
skp_hero_desc:
|
||||||
|
"Study at the leading campus in West Kalimantan with complete facilities, comfortable environment, and affordable student life",
|
||||||
|
|
||||||
// --- About Section ---
|
// --- About Section ---
|
||||||
skp_about_eyebrow: "About Untan",
|
skp_about_eyebrow: "About Untan",
|
||||||
skp_about_title: "A Leading Campus in West Kalimantan",
|
skp_about_title: "A Leading Campus in West Kalimantan",
|
||||||
skp_about_desc_1: "Universitas Tanjungpura is a leading public university in West Kalimantan committed to delivering quality education.",
|
skp_about_desc_1:
|
||||||
skp_about_desc_2: "UNTAN continues to drive research development, innovation, and collaboration across various fields.",
|
"Universitas Tanjungpura is a leading public university in West Kalimantan committed to delivering quality education.",
|
||||||
skp_about_desc_3: "Supported by a comfortable learning environment, students have the opportunity to grow both academically and non-academically.",
|
skp_about_desc_2:
|
||||||
|
"UNTAN continues to drive research development, innovation, and collaboration across various fields.",
|
||||||
|
skp_about_desc_3:
|
||||||
|
"Supported by a comfortable learning environment, students have the opportunity to grow both academically and non-academically.",
|
||||||
skp_about_link_text: "Visit Official Website",
|
skp_about_link_text: "Visit Official Website",
|
||||||
|
|
||||||
// --- Facilities Section ---
|
// --- Facilities Section ---
|
||||||
skp_fac_eyebrow: "Campus Facilities",
|
skp_fac_eyebrow: "Campus Facilities",
|
||||||
skp_fac_main_title: "Campus Facilities for a Comfortable Learning Experience",
|
skp_fac_main_title:
|
||||||
|
"Campus Facilities for a Comfortable Learning Experience",
|
||||||
skp_fac_title_perpus: "UNTAN Library",
|
skp_fac_title_perpus: "UNTAN Library",
|
||||||
skp_fac_desc_perpus: "The most complete collection of digital and physical literature with a quiet and modern reading room.",
|
skp_fac_desc_perpus:
|
||||||
|
"The most complete collection of digital and physical literature with a quiet and modern reading room.",
|
||||||
skp_fac_title_rusunawa: "Student Dormitory (Rusunawa)",
|
skp_fac_title_rusunawa: "Student Dormitory (Rusunawa)",
|
||||||
skp_fac_desc_rusunawa: "Safe, affordable, and strategically located student housing within the campus environment.",
|
skp_fac_desc_rusunawa:
|
||||||
|
"Safe, affordable, and strategically located student housing within the campus environment.",
|
||||||
skp_fac_title_rs: "Untan Hospital & Pratama Clinic",
|
skp_fac_title_rs: "Untan Hospital & Pratama Clinic",
|
||||||
skp_fac_desc_rs: "Excellent health services for the entire academic community with professional medical staff.",
|
skp_fac_desc_rs:
|
||||||
|
"Excellent health services for the entire academic community with professional medical staff.",
|
||||||
skp_fac_title_gkb: "Shared Lecture Building (GKB)",
|
skp_fac_title_gkb: "Shared Lecture Building (GKB)",
|
||||||
skp_fac_desc_gkb: "Interactive classrooms with the latest multimedia technology support for the teaching and learning process.",
|
skp_fac_desc_gkb:
|
||||||
|
"Interactive classrooms with the latest multimedia technology support for the teaching and learning process.",
|
||||||
skp_fac_title_bahasa: "Language Center (UPT Bahasa)",
|
skp_fac_title_bahasa: "Language Center (UPT Bahasa)",
|
||||||
skp_fac_desc_bahasa: "Foreign language training and international certification center to support global careers.",
|
skp_fac_desc_bahasa:
|
||||||
|
"Foreign language training and international certification center to support global careers.",
|
||||||
skp_fac_title_olahraga: "Sports Area",
|
skp_fac_title_olahraga: "Sports Area",
|
||||||
skp_fac_desc_olahraga: "Complete outdoor and indoor sports facilities to maintain fitness and channel talents.",
|
skp_fac_desc_olahraga:
|
||||||
|
"Complete outdoor and indoor sports facilities to maintain fitness and channel talents.",
|
||||||
skp_fac_title_masjid: "Muhtadin Mosque UNTAN",
|
skp_fac_title_masjid: "Muhtadin Mosque UNTAN",
|
||||||
skp_fac_desc_masjid: "A comfortable and inclusive place of worship for the UNTAN academic community with a soothing religious atmosphere.",
|
skp_fac_desc_masjid:
|
||||||
|
"A comfortable and inclusive place of worship for the UNTAN academic community with a soothing religious atmosphere.",
|
||||||
skp_fac_title_lab: "UNTAN Campus Laboratory",
|
skp_fac_title_lab: "UNTAN Campus Laboratory",
|
||||||
skp_fac_desc_lab: "Modern UNTAN laboratory facilities that support student research, practicums, and innovation.",
|
skp_fac_desc_lab:
|
||||||
|
"Modern UNTAN laboratory facilities that support student research, practicums, and innovation.",
|
||||||
skp_fac_title_audit: "UNTAN Auditorium",
|
skp_fac_title_audit: "UNTAN Auditorium",
|
||||||
skp_fac_desc_audit: "A representative multi-purpose hall for seminars, academic events, and major campus activities.",
|
skp_fac_desc_audit:
|
||||||
|
"A representative multi-purpose hall for seminars, academic events, and major campus activities.",
|
||||||
|
|
||||||
// --- Campus Section ---
|
// --- Campus Section ---
|
||||||
skp_campus_eyebrow: "Campus Life",
|
skp_campus_eyebrow: "Campus Life",
|
||||||
skp_campus_title: "Student Activities & Campus Organizations",
|
skp_campus_title: "Student Activities & Campus Organizations",
|
||||||
skp_campus_subtitle: "UNTAN students have various opportunities to grow through organizations, Student Activity Units (UKM), communities, and extracurricular activities.",
|
skp_campus_subtitle:
|
||||||
|
"UNTAN students have various opportunities to grow through organizations, Student Activity Units (UKM), communities, and extracurricular activities.",
|
||||||
skp_campus_cat_org: "Organizations",
|
skp_campus_cat_org: "Organizations",
|
||||||
skp_campus_cat_ukm: "Student Units",
|
skp_campus_cat_ukm: "Student Units",
|
||||||
skp_campus_cat_com: "Communities",
|
skp_campus_cat_com: "Communities",
|
||||||
skp_campus_dir_bem_title: "BEM UNTAN",
|
skp_campus_dir_bem_title: "BEM UNTAN",
|
||||||
skp_campus_dir_bem_desc: "The university-level Student Executive Board that acts as a forum for student aspirations and movements for positive campus change.",
|
skp_campus_dir_bem_desc:
|
||||||
|
"The university-level Student Executive Board that acts as a forum for student aspirations and movements for positive campus change.",
|
||||||
skp_campus_dir_dpm_title: "DPM UNTAN",
|
skp_campus_dir_dpm_title: "DPM UNTAN",
|
||||||
skp_campus_dir_dpm_desc: "The Student Representative Council that performs legislative and supervisory functions over student organization policies at the university.",
|
skp_campus_dir_dpm_desc:
|
||||||
|
"The Student Representative Council that performs legislative and supervisory functions over student organization policies at the university.",
|
||||||
skp_campus_dir_hmif_title: "HMIF UNTAN",
|
skp_campus_dir_hmif_title: "HMIF UNTAN",
|
||||||
skp_campus_dir_hmif_desc: "A student organization under the Informatics Study Program that serves as a hub for academic development, leadership, and networking for its members.",
|
skp_campus_dir_hmif_desc:
|
||||||
|
"A student organization under the Informatics Study Program that serves as a hub for academic development, leadership, and networking for its members.",
|
||||||
skp_campus_dir_cafa_title: "CAFATIFA",
|
skp_campus_dir_cafa_title: "CAFATIFA",
|
||||||
skp_campus_dir_cafa_desc: "This organization provides a forum for service, faith formation, and character building for Catholic students in the faculty.",
|
skp_campus_dir_cafa_desc:
|
||||||
|
"This organization provides a forum for service, faith formation, and character building for Catholic students in the faculty.",
|
||||||
skp_campus_dir_mapala_title: "MAPALA UNTAN",
|
skp_campus_dir_mapala_title: "MAPALA UNTAN",
|
||||||
skp_campus_dir_mapala_desc: "A community for UNTAN student nature lovers that shapes a resilient character, environmental awareness, and an adventurous spirit.",
|
skp_campus_dir_mapala_desc:
|
||||||
|
"A community for UNTAN student nature lovers that shapes a resilient character, environmental awareness, and an adventurous spirit.",
|
||||||
skp_campus_dir_lisma_title: "LISMA UNTAN",
|
skp_campus_dir_lisma_title: "LISMA UNTAN",
|
||||||
skp_campus_dir_lisma_desc: "A student forum that develops interest in literacy, discussion, and critical thinking collaboratively.",
|
skp_campus_dir_lisma_desc:
|
||||||
|
"A student forum that develops interest in literacy, discussion, and critical thinking collaboratively.",
|
||||||
skp_campus_dir_lsmi_title: "LSMI UNTAN",
|
skp_campus_dir_lsmi_title: "LSMI UNTAN",
|
||||||
skp_campus_dir_lsmi_desc: "A student activity unit that handles religious guidance, Islamic outreach (da'wah), and spiritual development for students.",
|
skp_campus_dir_lsmi_desc:
|
||||||
|
"A student activity unit that handles religious guidance, Islamic outreach (da'wah), and spiritual development for students.",
|
||||||
skp_campus_dir_semut_title: "SARANG SEMUT",
|
skp_campus_dir_semut_title: "SARANG SEMUT",
|
||||||
skp_campus_dir_semut_desc: "A student community that fosters a culture of literacy, critical discussion, and intellectual thought within the campus environment.",
|
skp_campus_dir_semut_desc:
|
||||||
|
"A student community that fosters a culture of literacy, critical discussion, and intellectual thought within the campus environment.",
|
||||||
skp_campus_dir_aiesec_title: "AIESEC",
|
skp_campus_dir_aiesec_title: "AIESEC",
|
||||||
skp_campus_dir_aiesec_desc: "An international youth organization at UNTAN that develops leadership, global experience, and cross-cultural collaboration among students.",
|
skp_campus_dir_aiesec_desc:
|
||||||
|
"An international youth organization at UNTAN that develops leadership, global experience, and cross-cultural collaboration among students.",
|
||||||
|
|
||||||
// --- Pontianak City Section ---
|
// --- Pontianak City Section ---
|
||||||
skp_pontianak_eyebrow: "Pontianak City",
|
skp_pontianak_eyebrow: "Pontianak City",
|
||||||
skp_pontianak_title: "Live In Pontianak",
|
skp_pontianak_title: "Live In Pontianak",
|
||||||
skp_pontianak_desc: "Pontianak is not just the capital of West Kalimantan, but a comfortable place to live, student-friendly, and very affordable. The city offers complete access to public facilities, a tempting variety of culinary options, and an active, vibrant learning environment.",
|
skp_pontianak_desc:
|
||||||
|
"Pontianak is not just the capital of West Kalimantan, but a comfortable place to live, student-friendly, and very affordable. The city offers complete access to public facilities, a tempting variety of culinary options, and an active, vibrant learning environment.",
|
||||||
|
|
||||||
// --- Destination Section ---
|
// --- Destination Section ---
|
||||||
skp_dest_eyebrow: "Tourism & Destinations",
|
skp_dest_eyebrow: "Tourism & Destinations",
|
||||||
skp_dest_title: "Interesting Places in Pontianak",
|
skp_dest_title: "Interesting Places in Pontianak",
|
||||||
skp_dest_open_maps: "Open Maps",
|
skp_dest_open_maps: "Open Maps",
|
||||||
skp_dest_khatulistiwa_name: "Equator Monument",
|
skp_dest_khatulistiwa_name: "Equator Monument",
|
||||||
skp_dest_khatulistiwa_desc: "The city icon marking the zero-degree latitude position on earth.",
|
skp_dest_khatulistiwa_desc:
|
||||||
|
"The city icon marking the zero-degree latitude position on earth.",
|
||||||
skp_dest_waterfront_name: "Waterfront",
|
skp_dest_waterfront_name: "Waterfront",
|
||||||
skp_dest_waterfront_desc: "A popular pedestrian area by the Kapuas River to enjoy the sunset.",
|
skp_dest_waterfront_desc:
|
||||||
|
"A popular pedestrian area by the Kapuas River to enjoy the sunset.",
|
||||||
skp_dest_qubu_name: "Qubu Resort",
|
skp_dest_qubu_name: "Qubu Resort",
|
||||||
skp_dest_qubu_desc: "An integrated tourism park area and a 4-star resort in Kubu Raya.",
|
skp_dest_qubu_desc:
|
||||||
|
"An integrated tourism park area and a 4-star resort in Kubu Raya.",
|
||||||
skp_dest_radank_name: "Radakng House",
|
skp_dest_radank_name: "Radakng House",
|
||||||
skp_dest_radank_desc: "The traditional longhouse of the Dayak tribe, a symbol of cultural harmony.",
|
skp_dest_radank_desc:
|
||||||
|
"The traditional longhouse of the Dayak tribe, a symbol of cultural harmony.",
|
||||||
skp_dest_museum_name: "Museum",
|
skp_dest_museum_name: "Museum",
|
||||||
skp_dest_museum_desc: "Geographical and geological collections featuring maps and various types of rocks.",
|
skp_dest_museum_desc:
|
||||||
|
"Geographical and geological collections featuring maps and various types of rocks.",
|
||||||
skp_dest_amalzone_name: "Amalzone",
|
skp_dest_amalzone_name: "Amalzone",
|
||||||
skp_dest_amalzone_desc: "A popular nature tourism and family recreation destination.",
|
skp_dest_amalzone_desc:
|
||||||
|
"A popular nature tourism and family recreation destination.",
|
||||||
skp_dest_mangrove_name: "Mangrove Forest",
|
skp_dest_mangrove_name: "Mangrove Forest",
|
||||||
skp_dest_mangrove_desc: "Stunning natural scenery along a wooden trekking pathway.",
|
skp_dest_mangrove_desc:
|
||||||
|
"Stunning natural scenery along a wooden trekking pathway.",
|
||||||
skp_dest_mujahidin_name: "Mujahidin Mosque",
|
skp_dest_mujahidin_name: "Mujahidin Mosque",
|
||||||
skp_dest_mujahidin_desc: "The largest mosque in the West Kalimantan Province.",
|
skp_dest_mujahidin_desc:
|
||||||
|
"The largest mosque in the West Kalimantan Province.",
|
||||||
|
|
||||||
// --- Culinary Section ---
|
// --- Culinary Section ---
|
||||||
skp_cul_eyebrow: "Cafe & Culinary",
|
skp_cul_eyebrow: "Cafe & Culinary",
|
||||||
skp_cul_title: "Students' Favorite Culinary and Coffee Shops",
|
skp_cul_title: "Students' Favorite Culinary and Coffee Shops",
|
||||||
skp_cul_cat_rm: "Eateries",
|
skp_cul_cat_rm: "Eateries",
|
||||||
skp_cul_cat_cs: "Coffee Shops",
|
skp_cul_cat_cs: "Coffee Shops",
|
||||||
skp_cul_gebuk_desc: "Spicy and savory pounded chicken that makes you want to keep adding rice.",
|
skp_cul_gebuk_desc:
|
||||||
skp_cul_sari_desc: "Tempting home-cooked warmth, fall in love at first bite.",
|
"Spicy and savory pounded chicken that makes you want to keep adding rice.",
|
||||||
|
skp_cul_sari_desc:
|
||||||
|
"Tempting home-cooked warmth, fall in love at first bite.",
|
||||||
skp_cul_mom_desc: "Delicious home-style meals with generous portions.",
|
skp_cul_mom_desc: "Delicious home-style meals with generous portions.",
|
||||||
skp_cul_shine_desc: "Trendy rice bowls with attractive presentation and abundant toppings.",
|
skp_cul_shine_desc:
|
||||||
skp_cul_melepar_desc: "Crispy, savory, and spicy chicken, a student favorite with a crunchy, fiery bite.",
|
"Trendy rice bowls with attractive presentation and abundant toppings.",
|
||||||
skp_cul_umi_desc: "Cheap, filling, and spicy smashed chicken with an intensely satisfying kick.",
|
skp_cul_melepar_desc:
|
||||||
skp_cul_cw_desc: "CW Coffee originally started in 2015 as Cyber World iCafe, a high-speed 24-hour internet cafe.",
|
"Crispy, savory, and spicy chicken, a student favorite with a crunchy, fiery bite.",
|
||||||
skp_cul_nordu_desc: "NORDU Coffee & Eatery (popularly known as Kopi Nomor Dua) offers a comfortable place to work (WFH) with student-friendly coffee and meals.",
|
skp_cul_umi_desc:
|
||||||
skp_cul_kami_desc: "Toko Kami was founded in November 2021 by a creative youth named Yudistira Nusantara. The name is an acronym for Indonesian Snack and Beverage Shop.",
|
"Cheap, filling, and spicy smashed chicken with an intensely satisfying kick.",
|
||||||
skp_cul_lokale_desc: "Lokale was founded by Asmako in 2017. Rooted in the owner's passion for coffee brewing, Lokale brings modern coffee flavors tailored to the local palate.",
|
skp_cul_cw_desc:
|
||||||
skp_cul_weng_desc: "Weng Coffee is one of the living legends of coffee shops in the Equator City, operating since 1970.",
|
"CW Coffee originally started in 2015 as Cyber World iCafe, a high-speed 24-hour internet cafe.",
|
||||||
skp_cul_tropic_desc: "Tropic Cafe Pontianak is a pioneer of large-scale modern coffee shops in Pontianak, featuring a 24/7 non-stop concept with highly affordable prices.",
|
skp_cul_nordu_desc:
|
||||||
|
"NORDU Coffee & Eatery (popularly known as Kopi Nomor Dua) offers a comfortable place to work (WFH) with student-friendly coffee and meals.",
|
||||||
|
skp_cul_kami_desc:
|
||||||
|
"Toko Kami was founded in November 2021 by a creative youth named Yudistira Nusantara. The name is an acronym for Indonesian Snack and Beverage Shop.",
|
||||||
|
skp_cul_lokale_desc:
|
||||||
|
"Lokale was founded by Asmako in 2017. Rooted in the owner's passion for coffee brewing, Lokale brings modern coffee flavors tailored to the local palate.",
|
||||||
|
skp_cul_weng_desc:
|
||||||
|
"Weng Coffee is one of the living legends of coffee shops in the Equator City, operating since 1970.",
|
||||||
|
skp_cul_tropic_desc:
|
||||||
|
"Tropic Cafe Pontianak is a pioneer of large-scale modern coffee shops in Pontianak, featuring a 24/7 non-stop concept with highly affordable prices.",
|
||||||
|
|
||||||
// --- Living Cost Section ---
|
// --- Living Cost Section ---
|
||||||
skp_cost_eyebrow: "Student Living Cost",
|
skp_cost_eyebrow: "Student Living Cost",
|
||||||
skp_cost_title: "Estimated Living Cost for Students in Pontianak",
|
skp_cost_title: "Estimated Living Cost for Students in Pontianak",
|
||||||
skp_cost_desc: "Good financial planning helps students go through their study period more comfortably in Pontianak.",
|
skp_cost_desc:
|
||||||
|
"Good financial planning helps students go through their study period more comfortably in Pontianak.",
|
||||||
skp_cost_note: "*Data obtained is sourced from an internal survey",
|
skp_cost_note: "*Data obtained is sourced from an internal survey",
|
||||||
skp_cost_period: "per month",
|
skp_cost_period: "per month",
|
||||||
skp_cost_type_home: "Housing",
|
skp_cost_type_home: "Housing",
|
||||||
@@ -231,16 +320,18 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
function currentLang() {
|
function currentLang() {
|
||||||
if (typeof window.getLang === 'function') {
|
if (typeof window.getLang === "function") {
|
||||||
const l = window.getLang();
|
const l = window.getLang();
|
||||||
if (l === 'id' || l === 'en') return l;
|
if (l === "id" || l === "en") return l;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const saved = localStorage.getItem('if_untan_lang');
|
const saved = localStorage.getItem("if_untan_lang");
|
||||||
if (saved === 'id' || saved === 'en') return saved;
|
if (saved === "id" || saved === "en") return saved;
|
||||||
} catch (e) { /* localStorage unavailable */ }
|
} catch (e) {
|
||||||
const nav = (navigator.language || 'id').toLowerCase();
|
/* localStorage unavailable */
|
||||||
return nav.startsWith('en') ? 'en' : 'id';
|
}
|
||||||
|
const nav = (navigator.language || "id").toLowerCase();
|
||||||
|
return nav.startsWith("en") ? "en" : "id";
|
||||||
}
|
}
|
||||||
|
|
||||||
function skpT(key) {
|
function skpT(key) {
|
||||||
@@ -251,13 +342,13 @@
|
|||||||
function applySkp(root) {
|
function applySkp(root) {
|
||||||
const scope = root || document;
|
const scope = root || document;
|
||||||
|
|
||||||
scope.querySelectorAll('[data-skp-i18n]').forEach(el => {
|
scope.querySelectorAll("[data-skp-i18n]").forEach((el) => {
|
||||||
const val = skpT(el.getAttribute('data-skp-i18n'));
|
const val = skpT(el.getAttribute("data-skp-i18n"));
|
||||||
if (val != null) el.textContent = val;
|
if (val != null) el.textContent = val;
|
||||||
});
|
});
|
||||||
|
|
||||||
scope.querySelectorAll('[data-skp-i18n-placeholder]').forEach(el => {
|
scope.querySelectorAll("[data-skp-i18n-placeholder]").forEach((el) => {
|
||||||
const val = skpT(el.getAttribute('data-skp-i18n-placeholder'));
|
const val = skpT(el.getAttribute("data-skp-i18n-placeholder"));
|
||||||
if (val != null) el.placeholder = val;
|
if (val != null) el.placeholder = val;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -265,6 +356,6 @@
|
|||||||
window.skpT = skpT;
|
window.skpT = skpT;
|
||||||
window.applySkp = applySkp;
|
window.applySkp = applySkp;
|
||||||
|
|
||||||
document.addEventListener('languageChanged', () => applySkp());
|
document.addEventListener("languageChanged", () => applySkp());
|
||||||
document.addEventListener('DOMContentLoaded', () => applySkp());
|
document.addEventListener("DOMContentLoaded", () => applySkp());
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -1141,26 +1141,21 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<main id="main-content" class="pt-[88px] lg:pt-[160px] min-h-screen bg-white">
|
<main id="main-content" class="pt-[88px] lg:pt-[160px] min-h-screen bg-white">
|
||||||
<div class="container mx-auto px-4 lg:px-8 py-12">
|
<div class="container">
|
||||||
<div class="mb-8 pb-8 border-b border-slate-200">
|
|
||||||
<span class="bg-untan-yellow text-slate-900 text-[10px] font-bold uppercase tracking-widest px-2 py-0.5 inline-block mb-3">Tugas Halaman Statis</span>
|
|
||||||
<h1 class="text-3xl lg:text-4xl font-bold text-slate-900 mb-2">Sekilas Informatika UNTAN</h1>
|
|
||||||
<p class="text-slate-500 text-sm">Kelompok 01 — Jellyfish.Corp · Informatika UNTAN 2026</p>
|
|
||||||
</div>
|
|
||||||
<div id="assignment-body" class="prose prose-slate max-w-none">
|
<div id="assignment-body" class="prose prose-slate max-w-none">
|
||||||
<!-- ================= START: BAGIAN YANG DIEDIT KELOMPOK ================= -->
|
<!-- ================= START: BAGIAN YANG DIEDIT KELOMPOK ================= -->
|
||||||
<!-- ===================== A. HERO ===================== -->
|
<!-- ===================== A. HERO ===================== -->
|
||||||
<section class="jf-hero-landing">
|
<section class="jf-hero-landing">
|
||||||
<div class="jf-hero-landing-bg"></div>
|
<div class="jf-hero-landing-bg"></div>
|
||||||
<div class="container jf-hero-landing-inner">
|
<div class="container jf-hero-landing-inner">
|
||||||
<div class="jf-hero-landing-content">
|
<div class="jf-hero-landing-content content">
|
||||||
<h1 class="jf-hero-headline" data-i18n="grp_jellyfish_hero_title">Sekilas Informatika<br>
|
<h1 class="jf-hero-headline" data-i18n="grp_jellyfish_hero_title">Sekilas Informatika<br>
|
||||||
<h1 class="jf-hero-headline" data-i18n="grp_jellyfish_hero_subtitle" style="color: #feb401">Universitas Tanjungpura</h1>
|
<h1 class="jf-hero-headline" data-i18n="grp_jellyfish_hero_subtitle" style="color: #feb401">Universitas Tanjungpura</h1>
|
||||||
<p class="jf-hero-sub" data-i18n="grp_jellyfish_hero_desc">Mencetak talenta digital unggulan dari Kalimantan Barat untuk Indonesia dan
|
<p class="jf-hero-sub" data-i18n="grp_jellyfish_hero_desc">Mencetak talenta digital unggulan dari Kalimantan Barat untuk Indonesia dan
|
||||||
dunia. Bergabunglah bersama kami dalam perjalanan membangun masa depan teknologi.</p>
|
dunia. Bergabunglah bersama kami dalam perjalanan membangun masa depan teknologi.</p>
|
||||||
<div class="jf-hero-ctas">
|
<div class="jf-hero-ctas">
|
||||||
<a href="#kontak" class="jf-hero-cta-primary" data-i18n="grp_jellyfish_btn_register">Daftar Sekarang</a>
|
<a href="#kontak" class="jf-hero-cta-primary" data-i18n="grp_jellyfish_btn_register">Daftar Sekarang</a>
|
||||||
<a href="#tentang" class="jf-hero-cta-secondary" data-i18n="grp_jellyfish_btn_learn">Pelajari Lebih ↓</a>
|
<a href="#tentang" class="jf-hero-cta-secondary" data-i18n="grp_jellyfish_btn_learn">Pelajari Lebih Lanjut</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-hero-stats">
|
<div class="jf-hero-stats">
|
||||||
<div class="jf-hs-item">
|
<div class="jf-hs-item">
|
||||||
@@ -1183,8 +1178,8 @@
|
|||||||
|
|
||||||
<!-- ===================== B. TENTANG PRODI ===================== -->
|
<!-- ===================== B. TENTANG PRODI ===================== -->
|
||||||
<section class="jf-section jf-section-white" id="tentang">
|
<section class="jf-section jf-section-white" id="tentang">
|
||||||
<div class="container">
|
<div class="container ">
|
||||||
<div class="jf-about-layout">
|
<div class="jf-about-layout content">
|
||||||
<div class="jf-about-left">
|
<div class="jf-about-left">
|
||||||
<span class="jf-badge" data-i18n="grp_jellyfish_about_badge">Tentang Prodi</span>
|
<span class="jf-badge" data-i18n="grp_jellyfish_about_badge">Tentang Prodi</span>
|
||||||
<h2 class="jf-section-title" data-i18n="grp_jellyfish_about_title">Mengenal Program Studi Informatika UNTAN</h2>
|
<h2 class="jf-section-title" data-i18n="grp_jellyfish_about_title">Mengenal Program Studi Informatika UNTAN</h2>
|
||||||
@@ -1332,7 +1327,7 @@
|
|||||||
|
|
||||||
<!-- ===================== C. ANGKA ===================== -->
|
<!-- ===================== C. ANGKA ===================== -->
|
||||||
<section class="jf-section jf-section-light">
|
<section class="jf-section jf-section-light">
|
||||||
<div class="container">
|
<div class="container content">
|
||||||
<div class="jf-section-header jf-center">
|
<div class="jf-section-header jf-center">
|
||||||
<span class="jf-badge" data-i18n="grp_jellyfish_stats_badge">Data & Statistik</span>
|
<span class="jf-badge" data-i18n="grp_jellyfish_stats_badge">Data & Statistik</span>
|
||||||
<h2 class="jf-section-title" data-i18n="grp_jellyfish_stats_title">Informatika UNTAN dalam Angka</h2>
|
<h2 class="jf-section-title" data-i18n="grp_jellyfish_stats_title">Informatika UNTAN dalam Angka</h2>
|
||||||
@@ -1379,8 +1374,8 @@
|
|||||||
Informatika UNTAN (sejak 2023).</p>
|
Informatika UNTAN (sejak 2023).</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style="text-align:center;margin-top:1.5rem;">
|
<div class="jf-rasio-wrapper" style="display:flex; justify-content:center; margin-top:1rem;">
|
||||||
<div class="jf-stat-row-card" style="display:inline-block;padding:1rem 2.5rem;">
|
<div class="jf-stat-row-card" style="width:calc(33.333% - 1rem);">
|
||||||
<div class="jf-stat-row-label" data-i18n="grp_jellyfish_rasio_dosen">Rasio Dosen : Mahasiswa</div>
|
<div class="jf-stat-row-label" data-i18n="grp_jellyfish_rasio_dosen">Rasio Dosen : Mahasiswa</div>
|
||||||
<div class="jf-stat-row-num" style="color:#7c3aed;font-size:2rem;">1 : 11</div>
|
<div class="jf-stat-row-num" style="color:#7c3aed;font-size:2rem;">1 : 11</div>
|
||||||
<div style="font-size:0.75rem;color:#94a3b8;" data-i18n="grp_jellyfish_rasio_standar">Memenuhi standar BAN-PT</div>
|
<div style="font-size:0.75rem;color:#94a3b8;" data-i18n="grp_jellyfish_rasio_standar">Memenuhi standar BAN-PT</div>
|
||||||
@@ -1391,7 +1386,7 @@
|
|||||||
|
|
||||||
<!-- ===================== D. PENCAPAIAN ===================== -->
|
<!-- ===================== D. PENCAPAIAN ===================== -->
|
||||||
<section class="jf-section jf-section-white">
|
<section class="jf-section jf-section-white">
|
||||||
<div class="container">
|
<div class="container content">
|
||||||
<div class="jf-section-header jf-center">
|
<div class="jf-section-header jf-center">
|
||||||
<span class="jf-badge" data-i18n="grp_jellyfish_achievement_badge">Prestasi</span>
|
<span class="jf-badge" data-i18n="grp_jellyfish_achievement_badge">Prestasi</span>
|
||||||
<h2 class="jf-section-title" data-i18n="grp_jellyfish_achievement_title">Pencapaian Membanggakan</h2>
|
<h2 class="jf-section-title" data-i18n="grp_jellyfish_achievement_title">Pencapaian Membanggakan</h2>
|
||||||
@@ -1479,7 +1474,7 @@
|
|||||||
|
|
||||||
<!-- ===================== E. STUDY CLUB ===================== -->
|
<!-- ===================== E. STUDY CLUB ===================== -->
|
||||||
<section class="jf-section jf-section-light">
|
<section class="jf-section jf-section-light">
|
||||||
<div class="container">
|
<div class="container content">
|
||||||
<div class="jf-section-header jf-center">
|
<div class="jf-section-header jf-center">
|
||||||
<span class="jf-badge" data-i18n="grp_jellyfish_studyclub_badge">Komunitas</span>
|
<span class="jf-badge" data-i18n="grp_jellyfish_studyclub_badge">Komunitas</span>
|
||||||
<h2 class="jf-section-title" data-i18n="grp_jellyfish_studyclub_title">Study Club</h2>
|
<h2 class="jf-section-title" data-i18n="grp_jellyfish_studyclub_title">Study Club</h2>
|
||||||
@@ -1524,59 +1519,73 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- ===================== F. KARIR ===================== -->
|
<!-- ===================== F. KARIR ===================== -->
|
||||||
<section class="jf-section jf-section-white">
|
<section class="jf-section jf-section-white">
|
||||||
<div class="container">
|
<div class="container content">
|
||||||
<div class="jf-karir-layout">
|
<div class="jf-karir-layout">
|
||||||
<div class="jf-karir-left">
|
<div class="jf-karir-left">
|
||||||
<span class="jf-badge" data-i18n="grp_jellyfish_career_badge">Karir</span>
|
<span class="jf-badge" data-i18n="grp_jellyfish_career_badge">Karir</span>
|
||||||
<h2 class="jf-section-title" data-i18n="grp_jellyfish_career_title">Masa Depan Lulusan Informatika</h2>
|
<h2 class="jf-section-title" data-i18n="grp_jellyfish_career_title">Masa Depan Lulusan Informatika</h2>
|
||||||
<p class="jf-karir-headline-italic" data-i18n="grp_jellyfish_career_headline">Lulusan Informatika UNTAN bukan hanya pencari kerja — mereka pencipta solusi.</p>
|
|
||||||
<p data-i18n="grp_jellyfish_career_desc">Lulusan Prodi Informatika UNTAN diserap secara luas oleh industri teknologi, instansi pemerintah, BUMN, dan startup. Dengan bekal kompetensi digital yang kuat, karir cemerlang menanti di berbagai sektor strategis.</p>
|
<p data-i18n="grp_jellyfish_career_desc">Lulusan Prodi Informatika UNTAN diserap secara luas oleh berbagai sektor — mulai dari instansi pemerintah, korporasi swasta, lembaga pendidikan, hingga wirausaha mandiri. Kompetensi digital yang kuat membuka peluang karir di mana saja.</p>
|
||||||
<div class="jf-karir-other" style="margin-top:1.5rem;">
|
<div class="jf-karir-other" style="margin-top:1.5rem;">
|
||||||
<strong data-i18n="grp_jellyfish_bidang_karir">Bidang Karir Lainnya:</strong>
|
<strong data-i18n="grp_jellyfish_bidang_karir">Bidang Karir</strong>
|
||||||
<div class="jf-chip-wrap" style="margin-top:0.5rem;">
|
<div class="jf-chip-wrap" style="margin-top:0.5rem;">
|
||||||
<span class="jf-chip">IT Project Manager</span>
|
<span class="jf-chip">Web Developer</span>
|
||||||
<span class="jf-chip">Database Admin</span>
|
<span class="jf-chip">Data Engineer</span>
|
||||||
<span class="jf-chip">Cloud Architect</span>
|
<span class="jf-chip">Mobile Developer</span>
|
||||||
<span class="jf-chip">Game Developer</span>
|
<span class="jf-chip">UI / UX Designer</span>
|
||||||
<span class="jf-chip">Business Intelligence</span>
|
<span class="jf-chip">Networking / DevOps</span>
|
||||||
<span class="jf-chip">IoT Engineer</span>
|
<span class="jf-chip">Cybersecurity</span>
|
||||||
|
<span class="jf-chip">Machine Learning / AI</span>
|
||||||
|
<span class="jf-chip">Database Engineer</span>
|
||||||
<span class="jf-chip" data-i18n="grp_jellyfish_akademisi">Akademisi / Dosen</span>
|
<span class="jf-chip" data-i18n="grp_jellyfish_akademisi">Akademisi / Dosen</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-karir-right">
|
<div class="jf-karir-right">
|
||||||
<div class="jf-karir-card jf-karir-navy">
|
<div class="jf-karir-card jf-karir-navy">
|
||||||
<div class="jf-kc-title">Software Engineer</div>
|
<div class="jf-kc-title" data-i18n="grp_jellyfish_pemerintah">Pemerintah & Instansi Publik</div>
|
||||||
<div class="jf-kc-chips">
|
<div class="jf-kc-chips">
|
||||||
<span>Backend</span><span>Frontend</span><span>Mobile Dev</span><span>DevOps</span>
|
<span>Diskominfo</span>
|
||||||
|
<span>Bappeda</span>
|
||||||
|
<span>BKPSDM</span>
|
||||||
|
<span>Bapenda</span>
|
||||||
|
<span>KPU</span>
|
||||||
|
<span>BRIN</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-kc-company">Gojek, Tokopedia, Traveloka, Startup</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-karir-card jf-karir-purple">
|
<div class="jf-karir-card jf-karir-purple">
|
||||||
<div class="jf-kc-title">Data & AI Specialist</div>
|
<div class="jf-kc-title" data-i18n="grp_jellyfish_industri">Perusahaan Swasta & Korporasi</div>
|
||||||
<div class="jf-kc-chips">
|
<div class="jf-kc-chips">
|
||||||
<span>Data Scientist</span><span>ML Engineer</span><span>AI
|
<span>PT Telkom Indonesia</span>
|
||||||
Researcher</span><span>Business Analyst</span>
|
<span>Telkomsel</span>
|
||||||
|
<span>PLN Icon Plus</span>
|
||||||
|
<span>Bank BCA</span>
|
||||||
|
<span>Grab</span>
|
||||||
|
<span>Astra Daihatsu</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-kc-company">Bank, BUMN, Fintech</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-karir-card jf-karir-green">
|
<div class="jf-karir-card jf-karir-green">
|
||||||
<div class="jf-kc-title">Cybersecurity</div>
|
<div class="jf-kc-title" data-i18n="grp_jellyfish_perguruan_tinggi">Pendidikan, Organisasi & Lembaga Sosial</div>
|
||||||
<div class="jf-kc-chips">
|
<div class="jf-kc-chips">
|
||||||
<span>Penetration Tester</span><span>Security Analyst</span><span>Network
|
<span>UNTAN</span>
|
||||||
Engineer</span>
|
<span>Politeknik Negeri Sambas</span>
|
||||||
|
<span>STIKES Sambas</span>
|
||||||
|
<span>SMA / SMP / SD</span>
|
||||||
|
<span>Organisasi Keagamaan</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-kc-company">BSSN, Kominfo, Perbankan</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-karir-card jf-karir-orange">
|
<div class="jf-karir-card jf-karir-orange">
|
||||||
<div class="jf-kc-title" data-i18n="grp_jellyfish_wirausaha">Wirausaha Digital</div>
|
<div class="jf-kc-title" data-i18n="grp_jellyfish_wirausaha">Wirausaha, UMKM & Freelance</div>
|
||||||
<div class="jf-kc-chips">
|
<div class="jf-kc-chips">
|
||||||
<span>Founder Startup</span><span>Freelancer</span><span>Digital
|
<span>Freelancer</span>
|
||||||
Consultant</span><span>E-commerce</span>
|
<span>Web Developer</span>
|
||||||
|
<span>IT Consultant</span>
|
||||||
|
<span>Startup Founder</span>
|
||||||
|
<span>Creative Studio</span>
|
||||||
|
<span>UMKM Digital</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-kc-company" data-i18n="grp_jellyfish_mandiri">Mandiri, Remote Work</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1585,7 +1594,7 @@
|
|||||||
|
|
||||||
<!-- ===================== G. ALUMNI ===================== -->
|
<!-- ===================== G. ALUMNI ===================== -->
|
||||||
<section class="jf-section jf-section-light">
|
<section class="jf-section jf-section-light">
|
||||||
<div class="container">
|
<div class="container content">
|
||||||
<div class="jf-section-header jf-center">
|
<div class="jf-section-header jf-center">
|
||||||
<span class="jf-badge" data-i18n="grp_jellyfish_alumni_badge">Alumni</span>
|
<span class="jf-badge" data-i18n="grp_jellyfish_alumni_badge">Alumni</span>
|
||||||
<h2 class="jf-section-title" data-i18n="grp_jellyfish_alumni_title">Kisah Sukses Alumni</h2>
|
<h2 class="jf-section-title" data-i18n="grp_jellyfish_alumni_title">Kisah Sukses Alumni</h2>
|
||||||
@@ -1674,7 +1683,7 @@
|
|||||||
|
|
||||||
<!-- ===================== H. INFRASTRUKTUR ===================== -->
|
<!-- ===================== H. INFRASTRUKTUR ===================== -->
|
||||||
<section class="jf-section jf-section-dark">
|
<section class="jf-section jf-section-dark">
|
||||||
<div class="container">
|
<div class="container content">
|
||||||
<div class="jf-section-header jf-center">
|
<div class="jf-section-header jf-center">
|
||||||
<span class="jf-badge" data-i18n="grp_jellyfish_infra_badge">Infrastruktur</span>
|
<span class="jf-badge" data-i18n="grp_jellyfish_infra_badge">Infrastruktur</span>
|
||||||
<h2 class="jf-section-title" style="color:white;" data-i18n="grp_jellyfish_infra_title">Infrastruktur dan Fasilitas</h2>
|
<h2 class="jf-section-title" style="color:white;" data-i18n="grp_jellyfish_infra_title">Infrastruktur dan Fasilitas</h2>
|
||||||
@@ -1713,25 +1722,12 @@
|
|||||||
<div class="jf-infra-stat"><span>IEEE · Scopus · ACM</span></div>
|
<div class="jf-infra-stat"><span>IEEE · Scopus · ACM</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-license-bar">
|
|
||||||
<span class="jf-lic-label" data-i18n="grp_jellyfish_license">Lisensi Perangkat Lunak Tersedia:</span>
|
|
||||||
<div class="jf-lic-chips">
|
|
||||||
<span>Microsoft Office 365</span>
|
|
||||||
<span>JetBrains IDE</span>
|
|
||||||
<span>Adobe Creative Cloud</span>
|
|
||||||
<span>GitHub Enterprise</span>
|
|
||||||
<span>Figma Education</span>
|
|
||||||
<span>MATLAB</span>
|
|
||||||
<span>Cisco Packet Tracer</span>
|
|
||||||
<span>AWS Academy</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- ===================== I. MITRA ===================== -->
|
<!-- ===================== I. MITRA ===================== -->
|
||||||
<section class="jf-section jf-section-white">
|
<section class="jf-section jf-section-white">
|
||||||
<div class="container">
|
<div class="container content">
|
||||||
<div class="jf-section-header jf-center">
|
<div class="jf-section-header jf-center">
|
||||||
<span class="jf-badge" data-i18n="grp_jellyfish_partner_badge">Kerjasama</span>
|
<span class="jf-badge" data-i18n="grp_jellyfish_partner_badge">Kerjasama</span>
|
||||||
<h2 class="jf-section-title" data-i18n="grp_jellyfish_partner_title">Mitra Strategis Informatika UNTAN</h2>
|
<h2 class="jf-section-title" data-i18n="grp_jellyfish_partner_title">Mitra Strategis Informatika UNTAN</h2>
|
||||||
@@ -1742,78 +1738,104 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="jf-mitra-group-title" data-i18n="grp_jellyfish_industri">Industri & Swasta</div>
|
<div class="jf-mitra-group-title" data-i18n="grp_jellyfish_industri">Industri & Swasta</div>
|
||||||
<div class="jf-mitra-grid">
|
<div class="jf-mitra-grid" style="grid-template-columns:repeat(3,1fr);">
|
||||||
<div class="jf-mitra-card">
|
|
||||||
<div class="jf-mitra-logo"></div>
|
|
||||||
<div class="jf-mitra-name">PT. Indosat Ooredoo</div>
|
|
||||||
</div>
|
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-logo"></div>
|
<div class="jf-mitra-logo"></div>
|
||||||
<div class="jf-mitra-name">PT. PLN Nusantara</div>
|
<div class="jf-mitra-name">PT. PLN Nusantara</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_pln">Pembuatan aplikasi monitoring BBM untuk PLN Nusantara Power UP Kapuas (2025).</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="jf-mitra-group-title" data-i18n="grp_jellyfish_pemerintah">Instansi Pemerintah</div>
|
<div class="jf-mitra-group-title" data-i18n="grp_jellyfish_pemerintah">Instansi Pemerintah</div>
|
||||||
<div class="jf-mitra-grid jf-mitra-grid-gov" style="grid-template-columns:repeat(6,1fr)">
|
<div class="jf-mitra-grid jf-mitra-grid-gov" style="grid-template-columns:repeat(3,1fr)">
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-name">Diskominfo Kalbar</div>
|
<div class="jf-mitra-name">Diskominfo Kalbar</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_diskominfo_kalbar">Kerja sama dengan Diskominfo Kalbar untuk kerja praktek dan magang 2024-sekarang.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-name">POLDA Kalbar</div>
|
<div class="jf-mitra-name">POLDA Kalbar</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_polda">Penyelenggaraan CAT (Computer Assesment Test).</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-name">Bappeda Sambas</div>
|
<div class="jf-mitra-name">Bappeda Sambas</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_bappeda_sambas">Pemutakhiran Geoportal Kabupaten Sambas pada infrastruktur Sambas GO.ID (2024).</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-name">Bappeda Sintang</div>
|
<div class="jf-mitra-name">Bappeda Sintang</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_bappeda_sintang">Penyusunan Rencana Induk Sistem Informasi Geospasial kabupaten Sintang 2019, dan Kajian Analisa Dampak Lingkungan TPA dan IPLT.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-name">Bappeda Bengkayang</div>
|
<div class="jf-mitra-name">Bappeda Bengkayang</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_bappeda_bengkayang">Pembangunan Sistem Informasi Perencanaan Pembangunan Berbasis Data Geospasial dan Pendampingan Penyelenggaraan Informasi Geospasial Bagi Pemerintahan Daerah/Simpul Jaringan 2022.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-name">BKPSDM</div>
|
<div class="jf-mitra-name">BKPSDM</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_bkpsdm">Pengembangan dan pemeliharaan aplikasi E-Kinerja untuk manajemen kinerja aparatur sipil negara (2024).</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-name">BPBD Sintang</div>
|
<div class="jf-mitra-name">BPBD Sintang</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_bpbd_sintang">Pembuatan peta potensi daerah rawan bencana banjir Kabupaten Sintang sebagai referensi mitigasi (2022).</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-name">BKD Pontianak</div>
|
<div class="jf-mitra-name">BKD Kota Pontianak</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_bkd_pontianak">Pengadaan Peta GIS PBB-P2 Tahap II untuk pengelolaan data pajak bumi dan bangunan Kota Pontianak (2022).</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-name">Disperkim Singkawang</div>
|
<div class="jf-mitra-name">Disperkim Singkawang</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_disperkim_singkawang">Review baseline dan pemetaan kawasan permukiman kumuh Kota Singkawang (2020).</div>
|
||||||
|
</div>
|
||||||
|
<div class="jf-mitra-card">
|
||||||
|
<div class="jf-mitra-name">Diskominfo Singkawang</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_diskominfo_singkawang">Kerja sama dengan Diskominfo Singkawang untuk kerja praktek dan magang 2024-sekarang.</div>
|
||||||
|
</div>
|
||||||
|
<div class="jf-mitra-card">
|
||||||
|
<div class="jf-mitra-name">Diskominfo Pontianak</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_diskominfo_pontianak">Kerja sama dengan Diskominfo Pontianak untuk kerja praktek dan magang 2024-sekarang.</div>
|
||||||
|
</div>
|
||||||
|
<div class="jf-mitra-card">
|
||||||
|
<div class="jf-mitra-name">Badan Penelitian dan Pengembangan</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_balitbang">Pengembangan Dan Pemanfaatan Informasi Geospasial untuk Kelitbangan di Provinsi Kalbar.</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="jf-mitra-group-title" data-i18n="grp_jellyfish_perguruan_tinggi">Perguruan Tinggi & Lembaga Riset</div>
|
<div class="jf-mitra-group-title" data-i18n="grp_jellyfish_perguruan_tinggi">Perguruan Tinggi & Lembaga Riset</div>
|
||||||
<div class="jf-mitra-grid" style="grid-template-columns:repeat(6,1fr);">
|
<div class="jf-mitra-grid jf-mitra-grid-gov" style="grid-template-columns:repeat(3,1fr);">
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-name">UNIMAS Malaysia</div>
|
<div class="jf-mitra-name">UNIMAS Malaysia</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_unimas">Kerja sama pelaksanaan Study Excursion 2019-2025.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-name">UUM Malaysia</div>
|
<div class="jf-mitra-name">UUM Malaysia</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_uum">Kerja sama menyelenggarakan konferensi internasional (ICODSE) - 2019.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-name">UCS Sarawak</div>
|
<div class="jf-mitra-name">UCS Sarawak</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_ucs">Kerja sama menyelenggarakan konferensi internasional (ICODSE) - 2019.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-name">UTEM Malaysia</div>
|
<div class="jf-mitra-name">UTEM Malaysia</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_utem">Kerjasama penyelenggaraan konferensi nasional.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-name">IPB Indonesia</div>
|
<div class="jf-mitra-name">IPB Indonesia</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_ipb">Kerja sama menyelenggarakan konferensi internasional (ICODSE) - 2019.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-name">Polnep</div>
|
<div class="jf-mitra-name">Politeknik Negeri Pontianak</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_polnep">Kerja sama dengan Politeknik Negeri Pontianak untuk kerja praktek dan magang 2024-sekarang.</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="jf-mitra-card">
|
<div class="jf-mitra-card">
|
||||||
<div class="jf-mitra-name">Poltekkes Pontianak</div>
|
<div class="jf-mitra-name">Poltekkes Pontianak</div>
|
||||||
|
<div class="jf-mitra-desc" data-i18n="grp_jellyfish_mitra_poltekkes">Rancangan kerja sama program Informatika dengan Politeknik Kesehatan Kemenkes Pontianak (2025).</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- ===================== K. CTA / KONTAK ===================== -->
|
<!-- ===================== K. CTA / KONTAK ===================== -->
|
||||||
<section class="jf-section jf-cta-section" id="kontak">
|
<section class="jf-section jf-cta-section" id="kontak">
|
||||||
<div class="container jf-cta-inner">
|
<div class="container jf-cta-inner content">
|
||||||
<div class="jf-cta-left">
|
<div class="jf-cta-left">
|
||||||
<span class="jf-badge" data-i18n="grp_jellyfish_cta_badge">Bergabung Bersama Kami</span>
|
<span class="jf-badge" data-i18n="grp_jellyfish_cta_badge">Bergabung Bersama Kami</span>
|
||||||
<h2 class="jf-cta-title" data-i18n="grp_jellyfish_cta_title">Mulai Perjalanan Digital Anda <span class="jf-cta-highlight" data-i18n="grp_jellyfish_cta_highlight">Bersama Kami</span></h2>
|
<h2 class="jf-cta-title" data-i18n="grp_jellyfish_cta_title">Mulai Perjalanan Digital Anda <span class="jf-cta-highlight" data-i18n="grp_jellyfish_cta_highlight">Bersama Kami</span></h2>
|
||||||
|
|||||||
@@ -252,7 +252,9 @@ h1, h2, h3, h4, h5, h6 {
|
|||||||
/* Shell layout tambahan */
|
/* Shell layout tambahan */
|
||||||
.nav { background: #003150; padding: 1rem 0; }
|
.nav { background: #003150; padding: 1rem 0; }
|
||||||
.nav .brand { color: white; font-weight: 700; font-size: 1.1rem; letter-spacing: 0.02em; }
|
.nav .brand { color: white; font-weight: 700; font-size: 1.1rem; letter-spacing: 0.02em; }
|
||||||
.container { max-width: 1100px; margin: 0 auto; padding: 0 1.5rem; }
|
.container { max-width: 1100px;}
|
||||||
|
|
||||||
|
.content {padding: 0 50px;}
|
||||||
|
|
||||||
.hero { position: relative; background: linear-gradient(135deg, #003150 0%, #005eb8 60%, #00b5e2 100%); min-height: 320px; display: flex; align-items: flex-end; overflow: hidden; }
|
.hero { position: relative; background: linear-gradient(135deg, #003150 0%, #005eb8 60%, #00b5e2 100%); min-height: 320px; display: flex; align-items: flex-end; overflow: hidden; }
|
||||||
.hero-bg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: 0.18; }
|
.hero-bg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: 0.18; }
|
||||||
@@ -1512,6 +1514,37 @@ a { text-decoration: none; }
|
|||||||
box-shadow: 0 6px 20px rgba(0,94,184,.1);
|
box-shadow: 0 6px 20px rgba(0,94,184,.1);
|
||||||
transform: translateY(-3px);
|
transform: translateY(-3px);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.jf-mitra-desc {
|
||||||
|
font-size: .67rem;
|
||||||
|
color: #94a3b8;
|
||||||
|
line-height: 1.45;
|
||||||
|
margin-top: .2rem;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jf-mitra-name {
|
||||||
|
font-size: .75rem;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--slate);
|
||||||
|
line-height: 1.35;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jf-mitra-card {
|
||||||
|
background: var(--white);
|
||||||
|
border: 1px solid #e8eef5;
|
||||||
|
border-radius: .85rem;
|
||||||
|
padding: 1rem .85rem;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
text-align: center;
|
||||||
|
min-height: 90px;
|
||||||
|
gap: .35rem;
|
||||||
|
transition: all .25s;
|
||||||
|
}
|
||||||
|
|
||||||
.jf-mitra-logo { font-size: 1.5rem; }
|
.jf-mitra-logo { font-size: 1.5rem; }
|
||||||
.jf-mitra-name { font-size: .68rem; font-weight: 600; color: var(--slate); line-height: 1.35; }
|
.jf-mitra-name { font-size: .68rem; font-weight: 600; color: var(--slate); line-height: 1.35; }
|
||||||
|
|
||||||
@@ -1699,6 +1732,7 @@ a { text-decoration: none; }
|
|||||||
.jf-mitra-grid { grid-template-columns: repeat(3, 1fr); }
|
.jf-mitra-grid { grid-template-columns: repeat(3, 1fr); }
|
||||||
.jf-mitra-grid-gov { grid-template-columns: repeat(3, 1fr); }
|
.jf-mitra-grid-gov { grid-template-columns: repeat(3, 1fr); }
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 1024px) {
|
@media (max-width: 1024px) {
|
||||||
.jf-about-layout { grid-template-columns: 1fr; }
|
.jf-about-layout { grid-template-columns: 1fr; }
|
||||||
.jf-timeline-card { position: static; max-height: none; }
|
.jf-timeline-card { position: static; max-height: none; }
|
||||||
@@ -1725,7 +1759,14 @@ a { text-decoration: none; }
|
|||||||
.jf-hs-item { padding: 0; }
|
.jf-hs-item { padding: 0; }
|
||||||
.jf-cta-title { font-size: 1.9rem; }
|
.jf-cta-title { font-size: 1.9rem; }
|
||||||
}
|
}
|
||||||
|
@media (max-width: 640px) {
|
||||||
|
.jf-stats-row2 {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
.jf-rasio-wrapper .jf-stat-row-card {
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* =====================================================
|
/* =====================================================
|
||||||
WHITE TEXT FIXES — Dark Background Sections
|
WHITE TEXT FIXES — Dark Background Sections
|
||||||
===================================================== */
|
===================================================== */
|
||||||
|
|||||||
+70
-26
@@ -1,4 +1,4 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="id" class="scroll-smooth">
|
<html lang="id" class="scroll-smooth">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
@@ -1188,7 +1188,7 @@
|
|||||||
|
|
||||||
<div class="custom-stats">
|
<div class="custom-stats">
|
||||||
<div class="custom-stat-box">
|
<div class="custom-stat-box">
|
||||||
<div class="custom-stat-num custom-serif">212<span class="custom-stat-plus">+</span></div>
|
<div class="custom-stat-num custom-serif">212</div>
|
||||||
<div class="custom-stat-label" data-i18n="grp_m4n1fest_hero_stat_alumni">TOTAL ALUMNI</div>
|
<div class="custom-stat-label" data-i18n="grp_m4n1fest_hero_stat_alumni">TOTAL ALUMNI</div>
|
||||||
<div class="custom-stat-desc" style="font-size: 0.65rem; color: #a1a1aa; margin-top: 4px; line-height: 1.35; font-weight: normal; font-family: sans-serif;" data-i18n="grp_m4n1fest_hero_stat_alumni_desc">data diperoleh dari alumni terdata di tracer study</div>
|
<div class="custom-stat-desc" style="font-size: 0.65rem; color: #a1a1aa; margin-top: 4px; line-height: 1.35; font-weight: normal; font-family: sans-serif;" data-i18n="grp_m4n1fest_hero_stat_alumni_desc">data diperoleh dari alumni terdata di tracer study</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1197,7 +1197,7 @@
|
|||||||
<div class="custom-stat-label" data-i18n="grp_m4n1fest_hero_stat_batch">ANGKATAN</div>
|
<div class="custom-stat-label" data-i18n="grp_m4n1fest_hero_stat_batch">ANGKATAN</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="custom-stat-box" style="border-right: none;">
|
<div class="custom-stat-box" style="border-right: none;">
|
||||||
<div class="custom-stat-num custom-serif">202<span class="custom-stat-plus">+</span></div>
|
<div class="custom-stat-num custom-serif">170+</div>
|
||||||
<div class="custom-stat-label" data-i18n="grp_m4n1fest_hero_stat_company">PERUSAHAAN</div>
|
<div class="custom-stat-label" data-i18n="grp_m4n1fest_hero_stat_company">PERUSAHAAN</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1445,7 +1445,7 @@
|
|||||||
class="logo-initials"
|
class="logo-initials"
|
||||||
style="background: #f3f4f6; color: #4b5563"
|
style="background: #f3f4f6; color: #4b5563"
|
||||||
>
|
>
|
||||||
202+
|
160+
|
||||||
</div>
|
</div>
|
||||||
<span class="logo-name" style="color: #6b7280" data-i18n="grp_m4n1fest_logo_others">Lainnya</span>
|
<span class="logo-name" style="color: #6b7280" data-i18n="grp_m4n1fest_logo_others">Lainnya</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -1548,7 +1548,7 @@
|
|||||||
<path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" />
|
<path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" />
|
||||||
<path d="M18.5 2.5a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4z" />
|
<path d="M18.5 2.5a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4z" />
|
||||||
</svg>
|
</svg>
|
||||||
<span data-i18n="grp_m4n1fest_skill_btn_contrib">Isi Form Kontribusi</span>
|
<span data-i18n="grp_m4n1fest_skill_btn_contrib">Isi Form</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1593,23 +1593,23 @@
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr style="background: #fff; border-bottom: 1px solid #f1f5f9;">
|
<tr style="background: #fff; border-bottom: 1px solid #f1f5f9;">
|
||||||
<td style="padding: 14px 20px;">2024 Genap</td>
|
<td style="padding: 14px 20px;" data-i18n="grp_m4n1fest_table_p1">2024 Genap</td>
|
||||||
<td style="padding: 14px 20px; text-align: right;">50</td>
|
<td style="padding: 14px 20px; text-align: right;">50</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr style="background: #f8fafc; border-bottom: 1px solid #f1f5f9;">
|
<tr style="background: #f8fafc; border-bottom: 1px solid #f1f5f9;">
|
||||||
<td style="padding: 14px 20px;">2024 Ganjil</td>
|
<td style="padding: 14px 20px;" data-i18n="grp_m4n1fest_table_p2">2024 Ganjil</td>
|
||||||
<td style="padding: 14px 20px; text-align: right;">27</td>
|
<td style="padding: 14px 20px; text-align: right;">27</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr style="background: #fff; border-bottom: 1px solid #f1f5f9;">
|
<tr style="background: #fff; border-bottom: 1px solid #f1f5f9;">
|
||||||
<td style="padding: 14px 20px;">2023 Genap</td>
|
<td style="padding: 14px 20px;" data-i18n="grp_m4n1fest_table_p3">2023 Genap</td>
|
||||||
<td style="padding: 14px 20px; text-align: right;">63</td>
|
<td style="padding: 14px 20px; text-align: right;">63</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr style="background: #f8fafc; border-bottom: 1px solid #f1f5f9;">
|
<tr style="background: #f8fafc; border-bottom: 1px solid #f1f5f9;">
|
||||||
<td style="padding: 14px 20px;">2023 Ganjil</td>
|
<td style="padding: 14px 20px;" data-i18n="grp_m4n1fest_table_p4">2023 Ganjil</td>
|
||||||
<td style="padding: 14px 20px; text-align: right;">27</td>
|
<td style="padding: 14px 20px; text-align: right;">27</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr style="background: #fff; border-bottom: 1px solid #e2e8f0;">
|
<tr style="background: #fff; border-bottom: 1px solid #e2e8f0;">
|
||||||
<td style="padding: 14px 20px;">2022 Genap</td>
|
<td style="padding: 14px 20px;" data-i18n="grp_m4n1fest_table_p5">2022 Genap</td>
|
||||||
<td style="padding: 14px 20px; text-align: right;">45</td>
|
<td style="padding: 14px 20px; text-align: right;">45</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -1719,7 +1719,7 @@
|
|||||||
<div class="testi-meta">
|
<div class="testi-meta">
|
||||||
<div class="testi-name">Izhan Fakhruzi</div>
|
<div class="testi-name">Izhan Fakhruzi</div>
|
||||||
<div class="testi-role" data-i18n="grp_m4n1fest_testi3_role">
|
<div class="testi-role" data-i18n="grp_m4n1fest_testi3_role">
|
||||||
Dosen Tetap, UMP & Peneliti, Universidad de Granada
|
Dosen Tetap, UMP & Peneliti, Universidad de Granada · Angkatan 2005
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1831,7 +1831,7 @@
|
|||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
"
|
"
|
||||||
data-i18n="grp_m4n1fest_event2_meta"
|
data-i18n="grp_m4n1fest_event2_meta"
|
||||||
>Informatic Anniversary</span
|
>HUT Informatika</span
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<p class="event-desc" data-i18n="grp_m4n1fest_event2_desc">
|
<p class="event-desc" data-i18n="grp_m4n1fest_event2_desc">
|
||||||
@@ -1990,7 +1990,7 @@
|
|||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label" data-i18n="grp_m4n1fest_form_nim">NIM</label>
|
<label class="form-label" data-i18n="grp_m4n1fest_form_nim">NIM</label>
|
||||||
<input type="text" id="ika-nim" class="form-input" placeholder="H1031..." />
|
<input type="text" id="ika-nim" class="form-input" placeholder="D1041..." />
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label" data-i18n="grp_m4n1fest_form_angkatan">Angkatan *</label>
|
<label class="form-label" data-i18n="grp_m4n1fest_form_angkatan">Angkatan *</label>
|
||||||
@@ -2002,7 +2002,7 @@
|
|||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label" data-i18n="grp_m4n1fest_form_hp">No. HP / WhatsApp *</label>
|
<label class="form-label" data-i18n="grp_m4n1fest_form_hp">No. HP / WhatsApp *</label>
|
||||||
<input type="tel" id="ika-hp" class="form-input" placeholder="+62 812-xxxx-xxxx" />
|
<input type="tel" id="ika-hp" class="form-input" placeholder="0821xxxxx" />
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label" data-i18n="grp_m4n1fest_form_email">Email Aktif *</label>
|
<label class="form-label" data-i18n="grp_m4n1fest_form_email">Email Aktif *</label>
|
||||||
@@ -2026,7 +2026,7 @@
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label" data-i18n-html="grp_m4n1fest_form_instansi">Tempat Bekerja / Instansi
|
<label class="form-label" data-i18n-html="grp_m4n1fest_form_instansi">Tempat Bekerja / Instansi
|
||||||
<span class="form-note-optional">(opsional)</span></label>
|
<span class="form-note-optional">(opsional)</span></label>
|
||||||
<input type="text" id="ika-instansi" class="form-input" placeholder="Contoh: PT. Telkom Indonesia, Google..." />
|
<input type="text" id="ika-instansi" class="form-input" placeholder="Contoh: PT. Telkom Indonesia, Google..." data-i18n-placeholder="grp_m4n1fest_form_instansi_placeholder" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 3 Skill -->
|
<!-- 3 Skill -->
|
||||||
@@ -2047,7 +2047,7 @@
|
|||||||
<option>Cybersecurity</option>
|
<option>Cybersecurity</option>
|
||||||
<option>Machine Learning / AI</option>
|
<option>Machine Learning / AI</option>
|
||||||
<option>Database</option>
|
<option>Database</option>
|
||||||
<option>Lainnya</option>
|
<option value="Lainnya" data-i18n="grp_m4n1fest_form_skill_others">Lainnya</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
@@ -2062,7 +2062,7 @@
|
|||||||
<option>Cybersecurity</option>
|
<option>Cybersecurity</option>
|
||||||
<option>Machine Learning / AI</option>
|
<option>Machine Learning / AI</option>
|
||||||
<option>Database</option>
|
<option>Database</option>
|
||||||
<option>Lainnya</option>
|
<option value="Lainnya" data-i18n="grp_m4n1fest_form_skill_others">Lainnya</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
@@ -2077,7 +2077,7 @@
|
|||||||
<option>Cybersecurity</option>
|
<option>Cybersecurity</option>
|
||||||
<option>Machine Learning / AI</option>
|
<option>Machine Learning / AI</option>
|
||||||
<option>Database</option>
|
<option>Database</option>
|
||||||
<option>Lainnya</option>
|
<option value="Lainnya" data-i18n="grp_m4n1fest_form_skill_others">Lainnya</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -2844,20 +2844,59 @@
|
|||||||
const spinnerElement = document.getElementById('skill-note-spinner');
|
const spinnerElement = document.getElementById('skill-note-spinner');
|
||||||
const noteTextElement = document.getElementById('skill-note-text');
|
const noteTextElement = document.getElementById('skill-note-text');
|
||||||
|
|
||||||
// Menampilkan catatan status di bawah grafik keahlian
|
let alumniCount = 0;
|
||||||
function setSkillNote(text, shouldSpin, shouldShowCta) {
|
let isDataFetched = false;
|
||||||
|
let isFetchFailed = false;
|
||||||
|
|
||||||
|
// Menampilkan catatan status di bawah grafik keahlian dengan dukungan bilingual
|
||||||
|
function setSkillNote(shouldSpin) {
|
||||||
if (spinnerElement) {
|
if (spinnerElement) {
|
||||||
spinnerElement.style.animation = shouldSpin ? 'spin 1s linear infinite' : 'none';
|
spinnerElement.style.animation = shouldSpin ? 'spin 1s linear infinite' : 'none';
|
||||||
|
if (!shouldSpin) {
|
||||||
|
spinnerElement.style.display = 'none';
|
||||||
|
} else {
|
||||||
|
spinnerElement.style.display = 'inline-block';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!noteTextElement) return;
|
if (!noteTextElement) return;
|
||||||
|
|
||||||
if (shouldShowCta) {
|
const currentLang = typeof getLang === 'function' ? getLang() : 'id';
|
||||||
noteTextElement.innerHTML = `${text} <a href="#kontribusi" style="color:#2352a0;font-weight:700;text-decoration:underline;text-underline-offset:2px;">Isi form kontribusi</a>`;
|
|
||||||
|
if (!isDataFetched) {
|
||||||
|
if (isFetchFailed) {
|
||||||
|
if (currentLang === 'en') {
|
||||||
|
noteTextElement.innerHTML = `Skill data is empty, help us complete this data! <a href="#kontribusi" style="color:#2352a0;font-weight:700;text-decoration:underline;text-underline-offset:2px;">fill form</a>`;
|
||||||
|
} else {
|
||||||
|
noteTextElement.innerHTML = `Data skill masih kosong, bantu kami lengkapi data ini! <a href="#kontribusi" style="color:#2352a0;font-weight:700;text-decoration:underline;text-underline-offset:2px;">isi form</a>`;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
noteTextElement.textContent = currentLang === 'en' ? 'Loading alumni skill data...' : 'Memuat data skill alumni...';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
noteTextElement.textContent = text;
|
if (alumniCount === 0) {
|
||||||
|
if (currentLang === 'en') {
|
||||||
|
noteTextElement.innerHTML = `Skill data is empty, help us complete this data! <a href="#kontribusi" style="color:#2352a0;font-weight:700;text-decoration:underline;text-underline-offset:2px;">fill form</a>`;
|
||||||
|
} else {
|
||||||
|
noteTextElement.innerHTML = `Data skill masih kosong, bantu kami lengkapi data ini! <a href="#kontribusi" style="color:#2352a0;font-weight:700;text-decoration:underline;text-underline-offset:2px;">isi form</a>`;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (currentLang === 'en') {
|
||||||
|
noteTextElement.textContent = `Data from ${alumniCount} verified alumni.`;
|
||||||
|
} else {
|
||||||
|
noteTextElement.textContent = `Data dari ${alumniCount} alumni yang diverifikasi.`;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Terapkan translasi teks saat memuat halaman
|
||||||
|
setSkillNote(true);
|
||||||
|
|
||||||
|
// Pasang event listener untuk menangani pergantian bahasa dinamis
|
||||||
|
document.addEventListener('languageChanged', () => {
|
||||||
|
setSkillNote(isDataFetched ? false : !isFetchFailed);
|
||||||
|
});
|
||||||
|
|
||||||
// Menyaring dan mengelompokkan teks bebas ke kategori keahlian terstandar
|
// Menyaring dan mengelompokkan teks bebas ke kategori keahlian terstandar
|
||||||
function normalizeSkill(rawSkillText) {
|
function normalizeSkill(rawSkillText) {
|
||||||
if (!rawSkillText) return null;
|
if (!rawSkillText) return null;
|
||||||
@@ -2920,17 +2959,22 @@
|
|||||||
.then(responseText => {
|
.then(responseText => {
|
||||||
const rows = parseGoogleSheetsJson(responseText);
|
const rows = parseGoogleSheetsJson(responseText);
|
||||||
|
|
||||||
|
isDataFetched = true;
|
||||||
if (rows.length === 0) {
|
if (rows.length === 0) {
|
||||||
setSkillNote('Data skill masih kosong, bantu kami lengkapi data ini!', false, false);
|
alumniCount = 0;
|
||||||
|
setSkillNote(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
alumniCount = rows.length;
|
||||||
const counts = calculateSkillCounts(rows);
|
const counts = calculateSkillCounts(rows);
|
||||||
updateSkillBarsUI(counts);
|
updateSkillBarsUI(counts);
|
||||||
setSkillNote(`Data dari ${rows.length} alumni yang diverifikasi.`, false, false);
|
setSkillNote(false);
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
setSkillNote('Data skill masih kosong, bantu kami lengkapi data ini!', false, false);
|
isDataFetched = false;
|
||||||
|
isFetchFailed = true;
|
||||||
|
setSkillNote(false);
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|||||||
@@ -1198,6 +1198,12 @@ ul.achiever-achievements li::before {
|
|||||||
font-size: 0.74rem;
|
font-size: 0.74rem;
|
||||||
color: var(--muted);
|
color: var(--muted);
|
||||||
margin-top: 1px;
|
margin-top: 1px;
|
||||||
|
min-height: 3.8em;
|
||||||
|
}
|
||||||
|
@media (max-width: 660px) {
|
||||||
|
.testi-role {
|
||||||
|
min-height: auto;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.stars {
|
.stars {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|||||||
+19
-48
@@ -76,12 +76,7 @@
|
|||||||
window.APP_CONFIG = window.APP_CONFIG || {
|
window.APP_CONFIG = window.APP_CONFIG || {
|
||||||
debugLogs: false,
|
debugLogs: false,
|
||||||
dashboardRuntimeFetch: 'always',
|
dashboardRuntimeFetch: 'always',
|
||||||
dashboardTargetUrl: 'https://dashboard.informatika.untan.ac.id/index.php?penelitian',
|
dashboardApiUrl: 'https://proxykbk.netlify.app/.netlify/functions/dashboard',
|
||||||
dashboardProxyTemplates: [
|
|
||||||
'https://api.codetabs.com/v1/proxy?quest={{url}}',
|
|
||||||
'https://api.allorigins.win/get?url={{url}}&ts={{ts}}',
|
|
||||||
'https://thingproxy.freeboard.io/fetch/{{rawUrl}}'
|
|
||||||
]
|
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<!-- RODA_DASHBOARD_DATA -->
|
<!-- RODA_DASHBOARD_DATA -->
|
||||||
@@ -1661,57 +1656,33 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
let lastError = null;
|
let lastError = null;
|
||||||
|
|
||||||
|
if (isDashboardRuntimeFetchAllowed()) {
|
||||||
|
const dashboardApiUrl = window.APP_CONFIG?.dashboardApiUrl?.trim();
|
||||||
|
|
||||||
|
if (dashboardApiUrl) {
|
||||||
|
try {
|
||||||
|
const rows = await fetchProxyRows(dashboardApiUrl);
|
||||||
|
applyDashboardRows(rows);
|
||||||
|
return;
|
||||||
|
} catch (error) {
|
||||||
|
lastError = error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback ke data yang di-embed saat build jika runtime fetch gagal atau dinonaktifkan
|
||||||
const embeddedHtml = readEmbeddedDashboardHtml();
|
const embeddedHtml = readEmbeddedDashboardHtml();
|
||||||
if (embeddedHtml) {
|
if (embeddedHtml) {
|
||||||
try {
|
try {
|
||||||
applyDashboardRows(parseDashboardRows(embeddedHtml));
|
applyDashboardRows(parseDashboardRows(embeddedHtml));
|
||||||
return;
|
return;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
lastError = error;
|
lastError = lastError || error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isDashboardRuntimeFetchAllowed()) {
|
renderRisetFeedback('Pemuatan Data Gagal', getDashboardErrorMessage(lastError || new Error('DASHBOARD_RUNTIME_FETCH_DISABLED')), 'Coba Lagi', 'fetchDashboardData()');
|
||||||
renderRisetFeedback('Pemuatan Data Gagal', getDashboardErrorMessage(lastError || new Error('DASHBOARD_RUNTIME_FETCH_DISABLED')), 'Coba Lagi', 'fetchDashboardData()');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const targetUrl = window.APP_CONFIG?.dashboardTargetUrl?.trim();
|
|
||||||
const proxyTemplates = Array.isArray(window.APP_CONFIG?.dashboardProxyTemplates)
|
|
||||||
? window.APP_CONFIG.dashboardProxyTemplates.filter(Boolean)
|
|
||||||
: [];
|
|
||||||
|
|
||||||
// Endpoint server.js hanya ada saat development lokal.
|
|
||||||
const proxyServers = shouldUseLocalDashboardProxy() ? [() => '/api/dashboard'] : [];
|
|
||||||
|
|
||||||
// Deployment static memakai proxy publik karena tidak menjalankan server.js.
|
|
||||||
if (targetUrl) {
|
|
||||||
proxyTemplates.forEach((template) => {
|
|
||||||
proxyServers.push((url) => template
|
|
||||||
.replaceAll('{{url}}', encodeURIComponent(url))
|
|
||||||
.replaceAll('{{rawUrl}}', url)
|
|
||||||
.replaceAll('{{ts}}', String(Date.now())));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!proxyServers.length) {
|
|
||||||
renderRisetFeedback('Pemuatan Data Gagal', getDashboardErrorMessage(new Error('DASHBOARD_PROXY_NOT_CONFIGURED')), 'Coba Lagi', 'fetchDashboardData()');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const proxyUrls = proxyServers.map((getProxyUrl) => getProxyUrl(targetUrl));
|
|
||||||
const rows = await Promise.any(proxyUrls.map((proxyUrl) => fetchProxyRows(proxyUrl)));
|
|
||||||
applyDashboardRows(rows);
|
|
||||||
return;
|
|
||||||
} catch (error) {
|
|
||||||
lastError = error instanceof AggregateError && error.errors?.length
|
|
||||||
? error.errors[error.errors.length - 1]
|
|
||||||
: error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Jika semua proxy gagal
|
|
||||||
renderRisetFeedback('Pemuatan Data Gagal', getDashboardErrorMessage(lastError), 'Coba Lagi', 'fetchDashboardData()');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Generated
-13
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "roda",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"lockfileVersion": 3,
|
|
||||||
"requires": true,
|
|
||||||
"packages": {
|
|
||||||
"": {
|
|
||||||
"name": "roda",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"license": "ISC"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +1,3 @@
|
|||||||
{
|
{
|
||||||
"name": "roda",
|
"type": "commonjs"
|
||||||
"version": "1.0.0",
|
}
|
||||||
"description": "Project website untuk menampilkan sorotan dan prestasi karya mahasiswa program studi Informatika Universitas Tanjungpura.",
|
|
||||||
"main": "server.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1",
|
|
||||||
"start": "node server.js",
|
|
||||||
"dev": "node server.js"
|
|
||||||
},
|
|
||||||
"keywords": [],
|
|
||||||
"author": "",
|
|
||||||
"license": "ISC"
|
|
||||||
}
|
|
||||||
|
|||||||
+38
-85
@@ -6,64 +6,21 @@ const { URL } = require('url');
|
|||||||
const ROOT_DIR = __dirname;
|
const ROOT_DIR = __dirname;
|
||||||
const PARENT_DIR = path.join(__dirname, '..', '..');
|
const PARENT_DIR = path.join(__dirname, '..', '..');
|
||||||
const INDEX_PATH = path.join(ROOT_DIR, 'index.html');
|
const INDEX_PATH = path.join(ROOT_DIR, 'index.html');
|
||||||
const ENV_PATH = path.join(ROOT_DIR, '.env');
|
const HOST = process.env.HOST || '127.0.0.1';
|
||||||
const HOST = '127.0.0.1';
|
|
||||||
const PORT = Number(process.env.PORT || 3000);
|
const PORT = Number(process.env.PORT || 3000);
|
||||||
|
const DASHBOARD_TARGET_URL = 'https://dashboard.informatika.untan.ac.id/index.php?penelitian';
|
||||||
|
const RODA_PATH_PREFIX = '/groups/RODA';
|
||||||
|
|
||||||
function logServerError(scope, error, extra = {}) {
|
function logServerError(scope, error, extra = {}) {
|
||||||
console.error(`[${scope}]`, error && error.stack ? error.stack : error, extra);
|
console.error(`[${scope}]`, error && error.stack ? error.stack : error, extra);
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseEnvFile(filePath) {
|
|
||||||
if (!fs.existsSync(filePath)) {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
const env = {};
|
|
||||||
const lines = fs.readFileSync(filePath, 'utf8').split(/\r?\n/);
|
|
||||||
|
|
||||||
for (const rawLine of lines) {
|
|
||||||
const line = rawLine.trim();
|
|
||||||
if (!line || line.startsWith('#')) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const separatorIndex = line.indexOf('=');
|
|
||||||
if (separatorIndex === -1) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const key = line.slice(0, separatorIndex).trim();
|
|
||||||
let value = line.slice(separatorIndex + 1).trim();
|
|
||||||
|
|
||||||
if (
|
|
||||||
(value.startsWith('"') && value.endsWith('"')) ||
|
|
||||||
(value.startsWith("'") && value.endsWith("'"))
|
|
||||||
) {
|
|
||||||
value = value.slice(1, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
env[key] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
return env;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getAppConfig() {
|
function getAppConfig() {
|
||||||
const env = {
|
|
||||||
...parseEnvFile(ENV_PATH),
|
|
||||||
...process.env
|
|
||||||
};
|
|
||||||
|
|
||||||
const dashboardProxyTemplates = [
|
|
||||||
env.DASHBOARD_PROXY_1,
|
|
||||||
env.DASHBOARD_PROXY_2,
|
|
||||||
env.DASHBOARD_PROXY_3
|
|
||||||
].filter(Boolean);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
dashboardTargetUrl: env.DASHBOARD_TARGET_URL || '',
|
debugLogs: false,
|
||||||
dashboardProxyTemplates
|
dashboardRuntimeFetch: 'always',
|
||||||
|
dashboardApiUrl: 'api/dashboard',
|
||||||
|
dashboardTargetUrl: DASHBOARD_TARGET_URL,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,10 +28,6 @@ const DASHBOARD_CACHE_TTL_MS = 5 * 60 * 1000;
|
|||||||
let dashboardCache = { html: null, timestamp: 0 };
|
let dashboardCache = { html: null, timestamp: 0 };
|
||||||
|
|
||||||
async function fetchDashboardHtml() {
|
async function fetchDashboardHtml() {
|
||||||
const targetUrl = getAppConfig().dashboardTargetUrl;
|
|
||||||
if (!targetUrl) {
|
|
||||||
throw new Error('DASHBOARD_TARGET_URL kosong');
|
|
||||||
}
|
|
||||||
|
|
||||||
const now = Date.now();
|
const now = Date.now();
|
||||||
if (dashboardCache.html && (now - dashboardCache.timestamp) < DASHBOARD_CACHE_TTL_MS) {
|
if (dashboardCache.html && (now - dashboardCache.timestamp) < DASHBOARD_CACHE_TTL_MS) {
|
||||||
@@ -84,7 +37,7 @@ async function fetchDashboardHtml() {
|
|||||||
const controller = new AbortController();
|
const controller = new AbortController();
|
||||||
const timeoutId = setTimeout(() => controller.abort(), 12000);
|
const timeoutId = setTimeout(() => controller.abort(), 12000);
|
||||||
try {
|
try {
|
||||||
const response = await fetch(targetUrl, {
|
const response = await fetch(DASHBOARD_TARGET_URL, {
|
||||||
signal: controller.signal,
|
signal: controller.signal,
|
||||||
headers: {
|
headers: {
|
||||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36'
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36'
|
||||||
@@ -106,39 +59,14 @@ async function fetchDashboardHtml() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function validateAppConfig(config) {
|
|
||||||
const errors = [];
|
|
||||||
|
|
||||||
if (!config.dashboardTargetUrl) {
|
|
||||||
errors.push('DASHBOARD_TARGET_URL belum diisi.');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Array.isArray(config.dashboardProxyTemplates) || !config.dashboardProxyTemplates.length) {
|
|
||||||
errors.push('Minimal satu DASHBOARD_PROXY_* harus diisi.');
|
|
||||||
}
|
|
||||||
|
|
||||||
return errors;
|
|
||||||
}
|
|
||||||
|
|
||||||
function injectConfig(html) {
|
function injectConfig(html) {
|
||||||
const configScript = `<script>window.APP_CONFIG = ${JSON.stringify(getAppConfig())};</script>`;
|
const configScript = `<script>window.APP_CONFIG = ${JSON.stringify(getAppConfig())};</script>`;
|
||||||
const defaultConfigScript = '<script>\n window.APP_CONFIG = window.APP_CONFIG || {\n dashboardTargetUrl: \'\',\n dashboardProxyTemplates: []\n };\n </script>';
|
|
||||||
|
|
||||||
if (html.includes(defaultConfigScript)) {
|
|
||||||
return html.replace(defaultConfigScript, configScript);
|
|
||||||
}
|
|
||||||
|
|
||||||
return html.replace('</head>', ` ${configScript}\n</head>`);
|
return html.replace('</head>', ` ${configScript}\n</head>`);
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendHtml(res) {
|
function sendHtml(res) {
|
||||||
try {
|
try {
|
||||||
const html = fs.readFileSync(INDEX_PATH, 'utf8');
|
const html = fs.readFileSync(INDEX_PATH, 'utf8');
|
||||||
const configErrors = validateAppConfig(getAppConfig());
|
|
||||||
if (configErrors.length) {
|
|
||||||
logServerError('config', new Error('Invalid app config'), { configErrors });
|
|
||||||
}
|
|
||||||
|
|
||||||
const withConfig = injectConfig(html);
|
const withConfig = injectConfig(html);
|
||||||
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
||||||
res.end(withConfig);
|
res.end(withConfig);
|
||||||
@@ -195,28 +123,53 @@ function sendNotFound(res) {
|
|||||||
res.end('Not found');
|
res.end('Not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getRodaStaticPathname(pathname) {
|
||||||
|
if (pathname === RODA_PATH_PREFIX || pathname === `${RODA_PATH_PREFIX}/` || pathname === `${RODA_PATH_PREFIX}/index.html`) {
|
||||||
|
return '/index.html';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pathname.startsWith(`${RODA_PATH_PREFIX}/`)) {
|
||||||
|
return pathname.slice(RODA_PATH_PREFIX.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pathname;
|
||||||
|
}
|
||||||
|
|
||||||
const server = http.createServer((req, res) => {
|
const server = http.createServer((req, res) => {
|
||||||
try {
|
try {
|
||||||
const requestUrl = new URL(req.url, `http://${req.headers.host}`);
|
const requestUrl = new URL(req.url, `http://${req.headers.host}`);
|
||||||
const pathname = requestUrl.pathname;
|
const pathname = requestUrl.pathname;
|
||||||
|
|
||||||
if (pathname === '/' || pathname === '/index.html') {
|
if (pathname === '/' || pathname === '/index.html' || pathname === RODA_PATH_PREFIX || pathname === `${RODA_PATH_PREFIX}/` || pathname === `${RODA_PATH_PREFIX}/index.html`) {
|
||||||
sendHtml(res);
|
sendHtml(res);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pathname === '/api/dashboard') {
|
if (pathname === '/api/dashboard' || pathname === `${RODA_PATH_PREFIX}/api/dashboard`) {
|
||||||
|
if (req.method === 'OPTIONS') {
|
||||||
|
res.writeHead(204, {
|
||||||
|
'Access-Control-Allow-Origin': '*',
|
||||||
|
'Access-Control-Allow-Methods': 'GET',
|
||||||
|
});
|
||||||
|
res.end();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
fetchDashboardHtml()
|
fetchDashboardHtml()
|
||||||
.then(({ html, cached }) => {
|
.then(({ html, cached }) => {
|
||||||
res.writeHead(200, {
|
res.writeHead(200, {
|
||||||
'Content-Type': 'text/html; charset=utf-8',
|
'Content-Type': 'text/html; charset=utf-8',
|
||||||
'X-Cache': cached
|
'Access-Control-Allow-Origin': '*',
|
||||||
|
'X-Cache': cached,
|
||||||
});
|
});
|
||||||
res.end(html);
|
res.end(html);
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
logServerError('api-dashboard', error);
|
logServerError('api-dashboard', error);
|
||||||
res.writeHead(502, { 'Content-Type': 'text/plain; charset=utf-8' });
|
res.writeHead(502, {
|
||||||
|
'Content-Type': 'text/plain; charset=utf-8',
|
||||||
|
'Access-Control-Allow-Origin': '*',
|
||||||
|
});
|
||||||
res.end('DASHBOARD_FETCH_FAILED');
|
res.end('DASHBOARD_FETCH_FAILED');
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
@@ -237,7 +190,7 @@ const server = http.createServer((req, res) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Serve static files from ROOT_DIR
|
// Serve static files from ROOT_DIR
|
||||||
const filepath = path.join(ROOT_DIR, pathname);
|
const filepath = path.join(ROOT_DIR, getRodaStaticPathname(pathname));
|
||||||
const normalizedPath = path.normalize(filepath);
|
const normalizedPath = path.normalize(filepath);
|
||||||
|
|
||||||
// Security check: ensure the requested file is within ROOT_DIR
|
// Security check: ensure the requested file is within ROOT_DIR
|
||||||
|
|||||||
+3
-1
@@ -5,7 +5,9 @@
|
|||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "Student-safe static page assignment kit for Informatika UNTAN",
|
"description": "Student-safe static page assignment kit for Informatika UNTAN",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "node scripts/dev.js",
|
||||||
|
"dev:vite": "vite",
|
||||||
|
"dev:roda": "node groups/RODA/server.js",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"test:tapops": "node --test groups/Tapops/tests/*.test.mjs",
|
"test:tapops": "node --test groups/Tapops/tests/*.test.mjs",
|
||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
|
|||||||
@@ -0,0 +1,94 @@
|
|||||||
|
import { spawn } from 'node:child_process';
|
||||||
|
|
||||||
|
export function createDevProcessSpecs({
|
||||||
|
nodeCommand = process.execPath,
|
||||||
|
env = process.env,
|
||||||
|
} = {}) {
|
||||||
|
return {
|
||||||
|
roda: {
|
||||||
|
command: nodeCommand,
|
||||||
|
args: ['groups/RODA/server.js'],
|
||||||
|
options: {
|
||||||
|
env: {
|
||||||
|
...env,
|
||||||
|
HOST: env.RODA_HOST || '127.0.0.1',
|
||||||
|
PORT: env.RODA_PORT || '3000',
|
||||||
|
},
|
||||||
|
stdio: ['ignore', 'ignore', 'pipe'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
vite: {
|
||||||
|
command: nodeCommand,
|
||||||
|
args: ['node_modules/vite/bin/vite.js'],
|
||||||
|
options: {
|
||||||
|
env: { ...env },
|
||||||
|
stdio: 'inherit',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function startDevServers({
|
||||||
|
spawnProcess = spawn,
|
||||||
|
specs = createDevProcessSpecs(),
|
||||||
|
} = {}) {
|
||||||
|
const roda = spawnProcess(specs.roda.command, specs.roda.args, specs.roda.options);
|
||||||
|
const vite = spawnProcess(specs.vite.command, specs.vite.args, specs.vite.options);
|
||||||
|
let shuttingDown = false;
|
||||||
|
let rodaErrorOutput = '';
|
||||||
|
|
||||||
|
roda.stderr?.on('data', (chunk) => {
|
||||||
|
const message = String(chunk);
|
||||||
|
rodaErrorOutput += message;
|
||||||
|
if (!message.includes('EADDRINUSE')) {
|
||||||
|
process.stderr.write(`[roda] ${message}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function stopChildren() {
|
||||||
|
shuttingDown = true;
|
||||||
|
if (!roda.killed) {
|
||||||
|
roda.kill();
|
||||||
|
}
|
||||||
|
if (!vite.killed) {
|
||||||
|
vite.kill();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vite.on('exit', (code, signal) => {
|
||||||
|
shuttingDown = true;
|
||||||
|
if (!roda.killed) {
|
||||||
|
roda.kill();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (signal) {
|
||||||
|
process.exitCode = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
process.exitCode = code ?? 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
roda.on('exit', (code, signal) => {
|
||||||
|
if (shuttingDown) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rodaErrorOutput.includes('EADDRINUSE')) {
|
||||||
|
process.stderr.write('[roda] Port 3000 is already in use; continuing with the existing RODA server.\n');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const reason = signal ? `signal ${signal}` : `exit code ${code}`;
|
||||||
|
process.stderr.write(`[roda] server stopped unexpectedly (${reason})\n`);
|
||||||
|
if (!vite.killed) {
|
||||||
|
vite.kill();
|
||||||
|
}
|
||||||
|
process.exitCode = code || 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
process.once('SIGINT', stopChildren);
|
||||||
|
process.once('SIGTERM', stopChildren);
|
||||||
|
|
||||||
|
return { roda, vite };
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
import { startDevServers } from './dev-runner.js';
|
||||||
|
|
||||||
|
startDevServers();
|
||||||
+16
-55
@@ -10,9 +10,11 @@ const rodaDashboardCacheTtlMs = 5 * 60 * 1000;
|
|||||||
const dashboardRequestHeaders = {
|
const dashboardRequestHeaders = {
|
||||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36',
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36',
|
||||||
};
|
};
|
||||||
|
const rodaHost = process.env.RODA_HOST || '127.0.0.1';
|
||||||
|
const rodaPort = process.env.RODA_PORT || '3000';
|
||||||
|
const rodaTarget = `http://${rodaHost}:${rodaPort}`;
|
||||||
|
|
||||||
let rodaDashboardHtmlCache;
|
let rodaDashboardHtmlCache;
|
||||||
let rodaDashboardDevCache = { html: '', timestamp: 0 };
|
|
||||||
|
|
||||||
function collectHtmlInputs(dir) {
|
function collectHtmlInputs(dir) {
|
||||||
const inputs = {};
|
const inputs = {};
|
||||||
@@ -124,61 +126,20 @@ function embedRodaDashboardData() {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function serveRodaDashboardApi() {
|
|
||||||
return {
|
|
||||||
name: 'serve-roda-dashboard-api',
|
|
||||||
configureServer(server) {
|
|
||||||
server.middlewares.use(async (req, res, next) => {
|
|
||||||
const requestUrl = new URL(req.url || '/', 'http://localhost');
|
|
||||||
if (requestUrl.pathname !== '/api/dashboard') {
|
|
||||||
next();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (req.method !== 'GET' && req.method !== 'HEAD') {
|
|
||||||
res.writeHead(405, { 'Content-Type': 'text/plain; charset=utf-8' });
|
|
||||||
res.end('METHOD_NOT_ALLOWED');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const now = Date.now();
|
|
||||||
try {
|
|
||||||
let html = rodaDashboardDevCache.html;
|
|
||||||
let cacheStatus = 'HIT';
|
|
||||||
|
|
||||||
if (!html || (now - rodaDashboardDevCache.timestamp) >= rodaDashboardCacheTtlMs) {
|
|
||||||
html = await requestRodaDashboardHtml();
|
|
||||||
rodaDashboardDevCache = { html, timestamp: Date.now() };
|
|
||||||
cacheStatus = 'MISS';
|
|
||||||
}
|
|
||||||
|
|
||||||
res.writeHead(200, {
|
|
||||||
'Content-Type': 'text/html; charset=utf-8',
|
|
||||||
'X-Cache': cacheStatus,
|
|
||||||
});
|
|
||||||
res.end(req.method === 'HEAD' ? '' : html);
|
|
||||||
} catch (error) {
|
|
||||||
if (rodaDashboardDevCache.html) {
|
|
||||||
res.writeHead(200, {
|
|
||||||
'Content-Type': 'text/html; charset=utf-8',
|
|
||||||
'X-Cache': 'STALE',
|
|
||||||
});
|
|
||||||
res.end(req.method === 'HEAD' ? '' : rodaDashboardDevCache.html);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const message = error instanceof Error ? error.message : String(error);
|
|
||||||
console.warn(`[roda-dashboard] Dev dashboard fetch failed: ${message}`);
|
|
||||||
res.writeHead(502, { 'Content-Type': 'text/plain; charset=utf-8' });
|
|
||||||
res.end('DASHBOARD_FETCH_FAILED');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [serveRodaDashboardApi(), embedRodaDashboardData(), copyStaticAssets()],
|
plugins: [embedRodaDashboardData(), copyStaticAssets()],
|
||||||
|
server: {
|
||||||
|
proxy: {
|
||||||
|
'/groups/RODA/api/dashboard': {
|
||||||
|
target: rodaTarget,
|
||||||
|
changeOrigin: true,
|
||||||
|
},
|
||||||
|
'/api/dashboard': {
|
||||||
|
target: rodaTarget,
|
||||||
|
changeOrigin: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
build: {
|
build: {
|
||||||
rollupOptions: {
|
rollupOptions: {
|
||||||
input: collectHtmlInputs(root),
|
input: collectHtmlInputs(root),
|
||||||
|
|||||||
Reference in New Issue
Block a user