sidebar.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <?php
  2. /**
  3. * layouts/sidebar.php
  4. *
  5. * Left sidebar navigation — matches original modX Wayfinder output.
  6. * Active state is detected automatically from the current request URI.
  7. * Collapsible sections restore open state via Bootstrap accordion.
  8. *
  9. * Requires lib/auth.php to already be included (for getCurrentUser()).
  10. */
  11. $currentUser = getCurrentUser() ?? ['fullname' => ''];
  12. // Detect current path for active-link highlighting
  13. $currentPath = parse_url($_SERVER['REQUEST_URI'] ?? '', PHP_URL_PATH);
  14. /**
  15. * Return 'active' if $href matches the current path, else ''.
  16. */
  17. $isActive = fn(string $href): string =>
  18. str_starts_with($currentPath, $href) ? ' active' : '';
  19. /**
  20. * Return true if any child href matches the current path.
  21. */
  22. $groupActive = function (array $children) use ($currentPath): bool {
  23. foreach ($children as $child) {
  24. if (str_starts_with($currentPath, $child)) return true;
  25. }
  26. return false;
  27. };
  28. // Child paths per collapsible group — used to keep the right group open
  29. $consultantChildren = ['/dashboard/consultant/'];
  30. $weatherChildren = ['/dashboard/weather/'];
  31. $cropChildren = [
  32. '/dashboard/crop-analysis/soil-test-data/',
  33. '/dashboard/crop-analysis/plant-test-data/',
  34. '/dashboard/crop-analysis/water-test-data/',
  35. '/dashboard/crop-analysis/animal-dietary-balance/',
  36. '/dashboard/crop-analysis/compost-test-data/',
  37. ];
  38. $settingsChildren = [
  39. '/dashboard/client-settings/soil-recommendations.php',
  40. '/dashboard/client-settings/product-list.php',
  41. '/dashboard/client-settings/update-details.php',
  42. ];
  43. ?>
  44. <nav id="sidenavAccordion" class="sb-sidenav accordion sb-sidenav-dark">
  45. <div class="sb-sidenav-menu">
  46. <div class="nav">
  47. <!-- Consultant Dashboard -->
  48. <a href="/dashboard/consultant/index.php"
  49. class="nav-link<?= $isActive('/dashboard/consultant/') ?>">
  50. <div class="sb-nav-link-icon">
  51. <i class="fas fa-chart-line nav_icon"></i>
  52. </div>
  53. Consultant Dashboard
  54. </a>
  55. <!-- Planning Calendar -->
  56. <a href="/dashboard/planning-calendar.php"
  57. class="nav-link<?= $isActive('/dashboard/planning-calendar.php') ?>">
  58. <div class="sb-nav-link-icon">
  59. <i class="fa fa-map-marker nav_icon"></i>
  60. </div>
  61. Planning Calendar
  62. </a>
  63. <!-- Report History / Inbox -->
  64. <a href="/dashboard/inbox.php"
  65. class="nav-link<?= $isActive('/dashboard/inbox.php') ?>">
  66. <div class="sb-nav-link-icon">
  67. <i class="fa fa-inbox nav_icon"></i>
  68. </div>
  69. Report History
  70. </a>
  71. <!-- Weather (collapsible) -->
  72. <a class="nav-link<?= $groupActive($weatherChildren) ? '' : ' collapsed' ?>"
  73. href="#"
  74. data-bs-toggle="collapse"
  75. data-bs-target="#collapseWeather"
  76. aria-expanded="<?= $groupActive($weatherChildren) ? 'true' : 'false' ?>"
  77. aria-controls="collapseWeather">
  78. <div class="sb-nav-link-icon">
  79. <i class="fa fa-cloud nav_icon"></i>
  80. </div>
  81. Weather
  82. <div class="sb-sidenav-collapse-arrow">
  83. <i class="fas fa-angle-down"></i>
  84. </div>
  85. </a>
  86. <div class="collapse<?= $groupActive($weatherChildren) ? ' show' : '' ?>"
  87. id="collapseWeather"
  88. data-bs-parent="#sidenavAccordion">
  89. <nav class="sb-sidenav-menu-nested nav">
  90. <a class="nav-link<?= $isActive('/dashboard/weather/moisture-sensor-setup.php') ?>"
  91. href="/dashboard/weather/moisture-sensor-setup.php">
  92. <i class="fa fa-eye-dropper nav_icon"></i>&nbsp;Moisture Sensor Setup
  93. </a>
  94. <a class="nav-link<?= $isActive('/dashboard/weather/weather-monitoring.php') ?>"
  95. href="/dashboard/weather/weather-monitoring.php">
  96. <i class="fas fa-cloud-sun nav_icon"></i>&nbsp;Weather Monitoring
  97. </a>
  98. <a class="nav-link<?= $isActive('/dashboard/weather/moisture-monitoring.php') ?>"
  99. href="/dashboard/weather/moisture-monitoring.php">
  100. <i class="fas fa-tint nav_icon"></i>&nbsp;Moisture Monitoring
  101. </a>
  102. </nav>
  103. </div>
  104. <!-- Pesticide -->
  105. <a href="/dashboard/pesticide.php"
  106. class="nav-link<?= $isActive('/dashboard/pesticide.php') ?>">
  107. <div class="sb-nav-link-icon">
  108. <i class="fa fa-bug nav_icon"></i>
  109. </div>
  110. Pesticide
  111. </a>
  112. <!-- Crop Analysis (collapsible) -->
  113. <a class="nav-link<?= $groupActive($cropChildren) ? '' : ' collapsed' ?>"
  114. href="#"
  115. data-bs-toggle="collapse"
  116. data-bs-target="#collapseCropAnalysis"
  117. aria-expanded="<?= $groupActive($cropChildren) ? 'true' : 'false' ?>"
  118. aria-controls="collapseCropAnalysis">
  119. <div class="sb-nav-link-icon">
  120. <i class="fa fa-tree nav_icon"></i>
  121. </div>
  122. Crop Analysis
  123. <div class="sb-sidenav-collapse-arrow">
  124. <i class="fas fa-angle-down"></i>
  125. </div>
  126. </a>
  127. <div class="collapse<?= $groupActive($cropChildren) ? ' show' : '' ?>"
  128. id="collapseCropAnalysis"
  129. data-bs-parent="#sidenavAccordion">
  130. <nav class="sb-sidenav-menu-nested nav">
  131. <a class="nav-link<?= $isActive('/dashboard/crop-analysis/soil-test-data/') ?>"
  132. href="/dashboard/crop-analysis/soil-test-data/index.php">
  133. <i class="fas fa-globe-asia nav_icon"></i>&nbsp;Soil Test Data
  134. </a>
  135. <a class="nav-link<?= $isActive('/dashboard/crop-analysis/plant-test-data/') ?>"
  136. href="/dashboard/crop-analysis/plant-test-data/index.php">
  137. <i class="fab fa-pagelines nav_icon"></i>&nbsp;Plant Test Data
  138. </a>
  139. <a class="nav-link<?= $isActive('/dashboard/crop-analysis/water-test-data/') ?>"
  140. href="/dashboard/crop-analysis/water-test-data/index.php">
  141. <i class="fa fa-tint nav_icon"></i>&nbsp;Water Test Data
  142. </a>
  143. <a class="nav-link<?= $isActive('/dashboard/crop-analysis/animal-dietary-balance/') ?>"
  144. href="/dashboard/crop-analysis/animal-dietary-balance/index.php">
  145. <i class="fas fa-dog nav_icon"></i>&nbsp;Animal Dietary Balance
  146. </a>
  147. <a class="nav-link<?= $isActive('/dashboard/crop-analysis/compost-test-data/') ?>"
  148. href="/dashboard/crop-analysis/compost-test-data/index.php">
  149. <i class="fas fa-cloud nav_icon"></i>&nbsp;Compost Test Data
  150. </a>
  151. </nav>s
  152. </div>
  153. <!-- Irrigation Controller -->
  154. <a href="/dashboard/irrigation/"
  155. class="nav-link<?= $isActive('/dashboard/irrigation/') ?>">
  156. <div class="sb-nav-link-icon">
  157. <i class="fas fa-cloud-sun-rain nav_icon"></i>
  158. </div>
  159. Irrigation Controller
  160. </a>
  161. <!-- Client Settings (collapsible) -->
  162. <a class="nav-link<?= $groupActive($settingsChildren) ? '' : ' collapsed' ?>"
  163. href="#"
  164. data-bs-toggle="collapse"
  165. data-bs-target="#collapseSettings"
  166. aria-expanded="<?= $groupActive($settingsChildren) ? 'true' : 'false' ?>"
  167. aria-controls="collapseSettings">
  168. <div class="sb-nav-link-icon">
  169. <i class="fa fa-cog nav_icon"></i>
  170. </div>
  171. Client Settings
  172. <div class="sb-sidenav-collapse-arrow">
  173. <i class="fas fa-angle-down"></i>
  174. </div>
  175. </a>
  176. <div class="collapse<?= $groupActive($settingsChildren) ? ' show' : '' ?>"
  177. id="collapseSettings"
  178. data-bs-parent="#sidenavAccordion">
  179. <nav class="sb-sidenav-menu-nested nav">
  180. <a class="nav-link<?= $isActive('/dashboard/client-settings/soil-recommendations.php') ?>"
  181. href="/dashboard/client-settings/soil-recommendations.php">
  182. <i class="fa fa-cog nav_icon"></i>&nbsp;Soil Recommendations
  183. </a>
  184. <a class="nav-link<?= $isActive('/dashboard/client-settings/product-list.php') ?>"
  185. href="/dashboard/client-settings/product-list.php">
  186. <i class="fa fa-cog nav_icon"></i>&nbsp;Product List
  187. </a>
  188. <a class="nav-link<?= $isActive('/dashboard/client-settings/update-details.php') ?>"
  189. href="/dashboard/client-settings/update-details.php">
  190. <i class="fa fa-cog nav_icon"></i>&nbsp;Update Details
  191. </a>
  192. </nav>
  193. </div>
  194. <!-- Crop Cards -->
  195. <a href="/dashboard/crop-cards/"
  196. class="nav-link<?= $isActive('/dashboard/crop-cards/') ?>">
  197. <div class="sb-nav-link-icon">
  198. <i class="fa fa-tree nav_icon"></i>
  199. </div>
  200. Crop Cards
  201. </a>
  202. </div>
  203. </div>
  204. <!-- Footer: logged-in user -->
  205. <div class="sb-sidenav-footer">
  206. <div class="small">Logged in as:</div>
  207. <?= htmlspecialchars($currentUser['fullname'], ENT_QUOTES, 'UTF-8') ?>
  208. </div>
  209. </nav>