You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

project.blade.php 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. @extends('layouts.main')
  2. @php
  3. $hasNotification = true;
  4. $FDI_amt = 100000000;
  5. @endphp
  6. @section('content')
  7. <div class="flex flex-col gap-4 bg-white rounded p-10 min-h-screen">
  8. <div class="flex justify-between items-center">
  9. <p class="flex items-center text-xs">
  10. <i class="fa-solid fa-house text-[#BD8736] mr-1"></i>
  11. <span>Dashboard <i class="fa-solid fa-chevron-right"></i> Lihat Projek</span>
  12. </p>
  13. <div class="relative cursor-pointer hidden md:block">
  14. @if ($hasNotification)
  15. <div class="absolute top-[2px] left-0 w-2 h-2 bg-[#E50A0A] rounded-full"></div>
  16. @endif
  17. <i class="fa-regular fa-bell text-md hover:text-[#BD8736]"></i>
  18. </div>
  19. </div>
  20. <div class="flex flex-col lg:flex-row gap-2 w-full">
  21. <div class="relative w-full lg:w-fit">
  22. <input type="text" placeholder="Carian"
  23. class="w-full pl-4 pr-10 py-1 px-5 border border-gray-300 rounded-lg text-sm text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500" />
  24. <div class="pointer-events-none absolute text-gray-500 text-xs"
  25. style="top: 50%; transform: translateY(-50%); right:10px">
  26. <i class="fas fa-search"></i>
  27. </div>
  28. </div>
  29. <div class="relative w-full lg:w-fit">
  30. <select id="selectProjectType"
  31. class="appearance-none w-full pl-4 pr-10 py-1 px-5 border border-gray-300 rounded-lg text-sm text-gray-700 cursor-pointer bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500"
  32. onchange="fetchAndRenderProjects()">
  33. <option value="commited" selected>Komited</option>
  34. <option value="potential">Pontential</option>
  35. </select>
  36. </div>
  37. <div class="relative w-full lg:w-fit">
  38. <select id="selectProjectStatus"
  39. class="appearance-none w-full pl-4 pr-10 py-1 px-5 border border-gray-300 rounded-lg text-sm text-gray-700 cursor-pointer bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500"
  40. onchange="renderFDITable()">
  41. <option value="all" selected>Status</option>
  42. <option value="1">Perjanjian Muktamad</option>
  43. <option value="0">Deraf Perjanjian</option>
  44. </select>
  45. </div>
  46. <div class="relative w-full lg:w-fit">
  47. <select id="selectProjectArea"
  48. class="appearance-none w-full pl-4 pr-10 py-1 px-5 border border-gray-300 rounded-lg text-sm text-gray-700 cursor-pointer bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500"
  49. onchange="renderFDITable()">
  50. <option value="all" selected>Daerah</option>
  51. <option value="Gambang">Gambang</option>
  52. <option value="Pekan">Pekan</option>
  53. </select>
  54. </div>
  55. <div class="relative w-full lg:w-fit">
  56. <select id="selectProjectYear"
  57. class="appearance-none w-full pl-4 pr-10 py-1 px-5 border border-gray-300 rounded-lg text-sm text-gray-700 cursor-pointer bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500"
  58. onchange="renderFDITable()">
  59. <option value="all" selected>Tahun</option>
  60. <option value="2026">2026</option>
  61. <option value="2025">2025</option>
  62. </select>
  63. </div>
  64. <button
  65. class="bg-[#012961] hover:bg-blue-700 text-white font-semibold w-full lg:w-fit text-xs py-2 px-4 rounded-lg shadow-md transition duration-200">
  66. <span><i class="fa-solid fa-file-excel text-white text-xs pe-3"></i> Eksport</span>
  67. </button>
  68. </div>
  69. <div class="border rounded">
  70. <h5 class="font-semibold m-5">Senarai Pelaburan Komited Perbadanan Kemajuan Negeri Pahang (PKNP) 2025</h5>
  71. <div class="bg-[#012961] text-white p-5">
  72. <h3 class="text-xs font-bold">FOREIGN DIRECT INVESTMENT (FDI)</h3>
  73. </div>
  74. <div class="overflow-x-scroll overflow-hidden rounded-[10px]">
  75. <table class="min-w-[2000px] text-sm text-left text-gray-700 border-collapse">
  76. <thead>
  77. <tr>
  78. <th class="text-xs px-4 py-5">Bil</th>
  79. <th class="text-xs px-4 py-5">Nama Syarikat</th>
  80. <th class="text-xs px-4 py-5">Jenis Projek</th>
  81. <th class="text-xs px-4 py-5">Status</th>
  82. <th class="text-xs px-4 py-5">Catatan</th>
  83. <th class="text-xs px-4 py-5">Tarikh MOA Ditandatangani</th>
  84. <th class="text-xs px-4 py-5">Daerah</th>
  85. <th class="text-xs px-4 py-5">Anggaran Nilai Pelaburan (RM)</th>
  86. <th class="text-xs px-4 py-5">Anggaran Peluang Pekerjaan</th>
  87. <th class="text-xs px-4 py-5">Keluasan (Ekar)</th>
  88. </tr>
  89. </thead>
  90. <tbody id="FDItableBody">
  91. @foreach ($commitedFDIProject as $index => $project)
  92. <tr>
  93. <td class="px-4 py-2">{{ $index + 1 }}</td>
  94. <td class="px-4 py-2">{{ $project['company_name'] }}</td>
  95. <td class="px-4 py-2">{{ $project['type'] }}
  96. </td>
  97. <td class="px-4 py-2 text-center">
  98. @switch($project['status'])
  99. @case(1)
  100. <div class="px-3 py-1 text-xs rounded-lg border inline-block"
  101. style="color:#E5A20A; background-color:#FFFBF4; border-color:#E5A20A;width:100%">
  102. Perjanjian Muktamad
  103. </div>
  104. @break
  105. @case(0)
  106. <div class="px-3 py-1 text-xs rounded-lg border inline-block"
  107. style="color:#49B452; background-color:#F7FFF7; border-color:#49B452; width:100%">
  108. Deraf Perjanjian
  109. </div>
  110. @break
  111. <div></div>
  112. @default
  113. @endswitch
  114. </td>
  115. <td class="px-4 py-2 text-xs">{{ $project['note'] }}</td>
  116. <td class="px-4 py-2 text-xs">{{ $project['moa_date'] }}</td>
  117. <td class="px-4 py-2 text-xs">{{ $project['area'] }}</td>
  118. <td class="px-4 py-2 text-xs">{{ number_format($project['invesment_approx'], 2) }}</td>
  119. <td class="px-4 py-2 text-xs">{{ $project['labour_approx'] }}</td>
  120. @if ($project['land_area'])
  121. <td class="px-4 py-2 text-xs">{{ number_format($project['land_area']) }}</td>
  122. @else
  123. <td class="px-4 py-2 text-xs"><span class="text-md font-bold">TBC</span></td>
  124. @endif
  125. </tr>
  126. @endforeach
  127. </tbody>
  128. </table>
  129. </div>
  130. <div class="bg-[#F8F8F8] p-5">
  131. <h3 class="text-xs font-bold">JUMLAH FDI: <span class="ms-4">{{ number_format($FDI_amt, 2) }}</span></h3>
  132. </div>
  133. </div>
  134. <div class="border rounded overflow-hidden">
  135. <div class="bg-[#012961] text-white p-5">
  136. <h3 class="text-xs font-bold">Domestic Direct Investment (DDI)</h3>
  137. </div>
  138. <div class="overflow-x-scroll overflow-hidden rounded-[10px]">
  139. <table class="min-w-[2000px] text-sm text-left text-gray-700 border-collapse">
  140. <thead>
  141. <tr>
  142. <th class="text-xs px-4 py-5">Bil</th>
  143. <th class="text-xs px-4 py-5">Nama Syarikat</th>
  144. <th class="text-xs px-4 py-5">Jenis Projek</th>
  145. <th class="text-xs px-4 py-5">Status</th>
  146. <th class="text-xs px-4 py-5">Catatan</th>
  147. <th class="text-xs px-4 py-5">Tarikh MOA Ditandatangani</th>
  148. <th class="text-xs px-4 py-5">Daerah</th>
  149. <th class="text-xs px-4 py-5">Anggaran Nilai Pelaburan (RM)</th>
  150. <th class="text-xs px-4 py-5">Anggaran Peluang Pekerjaan</th>
  151. <th class="text-xs px-4 py-5">Keluasan (Ekar)</th>
  152. </tr>
  153. </thead>
  154. <tbody id="DDItableBody">
  155. @foreach ($commitedDDIProject as $index => $project)
  156. <tr>
  157. <td class="px-4 py-2">{{ $index + 1 }}</td>
  158. <td class="px-4 py-2">{{ $project['company_name'] }}</td>
  159. <td class="px-4 py-2">{{ $project['type'] }}
  160. </td>
  161. <td class="px-4 py-2 text-center">
  162. @switch($project['status'])
  163. @case(1)
  164. <div class="px-3 py-1 text-xs rounded-lg border inline-block"
  165. style="color:#E5A20A; background-color:#FFFBF4; border-color:#E5A20A;width:100%">
  166. Perjanjian Muktamad
  167. </div>
  168. @break
  169. @case(0)
  170. <div class="px-3 py-1 text-xs rounded-lg border inline-block"
  171. style="color:#49B452; background-color:#F7FFF7; border-color:#49B452; width:100%">
  172. Deraf Perjanjian
  173. </div>
  174. @break
  175. <div></div>
  176. @default
  177. @endswitch
  178. </td>
  179. <td class="px-4 py-2 text-xs">{{ $project['note'] }}</td>
  180. <td class="px-4 py-2 text-xs">{{ $project['moa_date'] }}</td>
  181. <td class="px-4 py-2 text-xs">{{ $project['area'] }}</td>
  182. <td class="px-4 py-2 text-xs">{{ number_format($project['invesment_approx'], 2) }}</td>
  183. <td class="px-4 py-2 text-xs">{{ $project['labour_approx'] }}</td>
  184. @if ($project['land_area'])
  185. <td class="px-4 py-2 text-xs">{{ number_format($project['land_area'], 2) }}</td>
  186. @else
  187. <td class="px-4 py-2 text-xs"><span class="text-md font-bold">TBC</span></td>
  188. @endif
  189. </tr>
  190. @endforeach
  191. </tbody>
  192. </table>
  193. </div>
  194. <div class="bg-[#F8F8F8] p-5">
  195. <h3 class="text-xs font-bold">JUMLAH DDI: <span class="ms-4">{{ number_format($FDI_amt, 2) }}</span>
  196. </h3>
  197. </div>
  198. </div>
  199. <div class="border rounded p-5">
  200. <h5 class="font-semibold mb-4">Rekod Penetapan KPI Pelaburan</h5>
  201. <p class="text-xs font-bold">YB Dato’ Pengerusi memohon agar sasaran adalah melebihi sasaran tahun 2024: <span
  202. class="text-[#BD8736]">DEADLINE, 2 WEEK from JPPP MEETING.</span></p>
  203. <p class="text-xs font-bold">15-04-2025 | Jumlah Pelaburan Komited telah dikemaskini berdasarkan data yang
  204. diisi
  205. oleh S-GLC. Jumlah pelaburan komited berjumlah RM 2,000,333.00.</p>
  206. </div>
  207. <button
  208. class="bg-[#012961] hover:bg-blue-700 text-white font-semibold w-fit text-xs py-2 px-4 rounded-lg shadow-md transition duration-200 ml-auto">
  209. <i class="fa-solid fa-edit text-white text-xs"></i>
  210. <span>Kemaskini</span>
  211. </button>
  212. </div>
  213. @endsection
  214. @section('scripts')
  215. <script>
  216. var FDIProject = [];
  217. var DDIProject = [];
  218. async function fetchAndRenderProjects() {
  219. const selectedType = document.getElementById('selectProjectType').value;
  220. try {
  221. const response = await fetch(`/api/project/${selectedType}`); // Adjust to your real endpoint
  222. const data = await response.json();
  223. if (!data.FDIProject || !data.DDIProject) return
  224. FDIProject = data.FDIProject
  225. DDIProject = data.DDIProject
  226. renderFDITable()
  227. renderDDITable()
  228. } catch (error) {
  229. console.error('Error fetching projects:', error);
  230. }
  231. }
  232. function renderFDITable() {
  233. const tbody = document.getElementById('FDItableBody');
  234. tbody.innerHTML = ''; // Clear existing content
  235. data = filterData(FDIProject)
  236. data.forEach((project, index) => {
  237. const statusHTML = (() => {
  238. switch (project.status) {
  239. case 1:
  240. return `<div class="px-3 py-1 text-xs rounded-lg border inline-block"
  241. style="color:#E5A20A; background-color:#FFFBF4; border-color:#E5A20A;width:100%">
  242. Perjanjian Muktamad</div>`;
  243. case 0:
  244. return `<div class="px-3 py-1 text-xs rounded-lg border inline-block"
  245. style="color:#49B452; background-color:#F7FFF7; border-color:#49B452;width:100%">
  246. Deraf Perjanjian</div>`;
  247. default:
  248. return `<div>-</div>`;
  249. }
  250. })();
  251. const row = `
  252. <tr>
  253. <td class="px-4 py-2">${index + 1}</td>
  254. <td class="px-4 py-2">${project.company_name}</td>
  255. <td class="px-4 py-2">${project.type}</td>
  256. <td class="px-4 py-2 text-center">${statusHTML}</td>
  257. <td class="px-4 py-2 text-xs">${project.note}</td>
  258. <td class="px-4 py-2 text-xs">${project.moa_date}</td>
  259. <td class="px-4 py-2 text-xs">${project.area}</td>
  260. <td class="px-4 py-2 text-xs">${Number(project.invesment_approx).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})}</td>
  261. <td class="px-4 py-2 text-xs">${project.labour_approx}</td>
  262. <td class="px-4 py-2 text-xs">${project.land_area ? Number(project.land_area).toLocaleString() : '<span class="text-md font-bold">TBC</span>'}</td>
  263. </tr>
  264. `;
  265. tbody.insertAdjacentHTML('beforeend', row);
  266. });
  267. }
  268. function renderDDITable() {
  269. const tbody = document.getElementById('DDItableBody');
  270. tbody.innerHTML = ''; // Clear existing content
  271. data = filterData(DDIProject)
  272. data.forEach((project, index) => {
  273. const statusHTML = (() => {
  274. switch (project.status) {
  275. case 1:
  276. return `<div class="px-3 py-1 text-xs rounded-lg border inline-block"
  277. style="color:#E5A20A; background-color:#FFFBF4; border-color:#E5A20A;width:100%">
  278. Perjanjian Muktamad</div>`;
  279. case 0:
  280. return `<div class="px-3 py-1 text-xs rounded-lg border inline-block"
  281. style="color:#49B452; background-color:#F7FFF7; border-color:#49B452;width:100%">
  282. Deraf Perjanjian</div>`;
  283. default:
  284. return `<div>-</div>`;
  285. }
  286. })();
  287. const row = `
  288. <tr>
  289. <td class="px-4 py-2">${index + 1}</td>
  290. <td class="px-4 py-2">${project.company_name}</td>
  291. <td class="px-4 py-2">${project.type}</td>
  292. <td class="px-4 py-2 text-center">${statusHTML}</td>
  293. <td class="px-4 py-2 text-xs">${project.note}</td>
  294. <td class="px-4 py-2 text-xs">${project.moa_date}</td>
  295. <td class="px-4 py-2 text-xs">${project.area}</td>
  296. <td class="px-4 py-2 text-xs">${Number(project.invesment_approx).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})}</td>
  297. <td class="px-4 py-2 text-xs">${project.labour_approx}</td>
  298. <td class="px-4 py-2 text-xs">${project.land_area ? Number(project.land_area).toLocaleString() : '<span class="text-md font-bold">TBC</span>'}</td>
  299. </tr>
  300. `;
  301. tbody.insertAdjacentHTML('beforeend', row);
  302. });
  303. }
  304. function filterData(data) {
  305. const status = document.getElementById("selectProjectStatus").value
  306. const area = document.getElementById("selectProjectArea").value
  307. const year = document.getElementById("selectProjectYear").value
  308. // filter by status
  309. data = data.filter(project => (status === "all" || parseInt(status) === parseInt(project.status)))
  310. // filter by area
  311. data = data.filter(project => (area === "all" || area === project.area))
  312. // filter by year
  313. data = data.filter(project => (year === "all" || parseInt(year) === parseInt(project.year)))
  314. return data
  315. }
  316. document.addEventListener('DOMContentLoaded', fetchAndRenderProjects);
  317. </script>
  318. @endsection