|
12 | 12 | echo '<script src="js/leaflet.markercluster.js"></script>'; |
13 | 13 | echo '<script src="js/leaflet.awesome-markers.min.js"></script>'; |
14 | 14 |
|
15 | | -echo "<div class='row'> |
16 | | - <div class='col-md-12'> |
17 | | - <div class='panel panel-default panel-condensed device-overview overview-panel'> |
18 | | - <div class='panel-heading'>"; |
| 15 | +echo "<div class='overview-panel tw:mb-5'> |
| 16 | + <div class='tw:px-4 tw:py-2.5 tw:bg-neutral-100 tw:border-b tw:border-gray-300 tw:text-neutral-700 tw:dark:bg-dark-gray-200 tw:dark:border-zinc-800 tw:dark:text-dark-white-200'>"; |
19 | 17 |
|
20 | 18 | if (LibrenmsConfig::get('overview_show_sysDescr')) { |
21 | 19 | echo '<i class="fa fa-id-card fa-lg icon-theme" aria-hidden="true"></i> <strong>'; |
22 | 20 | echo LibrenmsConfig::get('overview_show_sysDescr', true) ? Clean::html($device['sysDescr'], []) : 'System'; |
23 | 21 | echo '</strong>'; |
24 | 22 | } |
25 | 23 |
|
26 | | -echo '</div><div class="panel-body">'; |
| 24 | +echo '</div><div class="tw:flex tw:flex-col tw:bg-white tw:divide-y tw:divide-gray-300 tw:dark:bg-dark-gray-400 tw:dark:divide-zinc-800">'; |
27 | 25 |
|
28 | 26 | if ($device['os'] == 'ios' || $device['os'] == 'iosxe') { |
29 | 27 | \LibreNMS\Util\Rewrite::ciscoHardware($device, false); |
|
35 | 33 |
|
36 | 34 | $device['os_text'] = LibrenmsConfig::getOsSetting($device['os'], 'text'); |
37 | 35 |
|
38 | | -echo '<div class="row"> |
39 | | - <div class="col-sm-4">System Name</div> |
40 | | - <div class="col-sm-8">' . Clean::html($device['sysName'], []) . ' </div> |
| 36 | +echo '<div class="tw:grid tw:items-center tw:gap-2.5 tw:px-2 tw:py-2 tw:hover:bg-neutral-100 tw:dark:hover:bg-dark-gray-300 tw:grid-cols-[1fr_2fr]"> |
| 37 | + <div class="tw:font-medium">System Name</div> |
| 38 | + <div>' . Clean::html($device['sysName'], []) . ' </div> |
41 | 39 | </div>'; |
42 | 40 |
|
43 | 41 | if (! empty($device['overwrite_ip'])) { |
44 | | - echo "<div class='row'><div class='col-sm-4'>Assigned IP</div><div class='col-sm-8'>" . htmlentities((string) $device['overwrite_ip']) . '</div></div>'; |
| 42 | + echo '<div class="tw:grid tw:items-center tw:gap-2.5 tw:px-2 tw:py-2 tw:hover:bg-neutral-100 tw:dark:hover:bg-dark-gray-300 tw:grid-cols-[1fr_2fr]"><div class="tw:font-medium">Assigned IP</div><div>' . htmlentities((string) $device['overwrite_ip']) . '</div></div>'; |
45 | 43 | } elseif (! empty($device['ip'])) { |
46 | | - echo "<div class='row'><div class='col-sm-4'>Resolved IP</div><div class='col-sm-8'>" . htmlentities((string) $device['ip']) . '</div></div>'; |
| 44 | + echo '<div class="tw:grid tw:items-center tw:gap-2.5 tw:px-2 tw:py-2 tw:hover:bg-neutral-100 tw:dark:hover:bg-dark-gray-300 tw:grid-cols-[1fr_2fr]"><div class="tw:font-medium">Resolved IP</div><div>' . htmlentities((string) $device['ip']) . '</div></div>'; |
47 | 45 | } else { |
48 | 46 | try { |
49 | 47 | $ip = (string) IP::parse($device['hostname']); |
50 | 48 | if ($ip !== format_hostname($device)) { |
51 | | - echo "<div class='row'><div class='col-sm-4'>IP Address</div><div class='col-sm-8'>" . htmlentities($ip) . '</div></div>'; |
| 49 | + echo '<div class="tw:grid tw:items-center tw:gap-2.5 tw:px-2 tw:py-2 tw:hover:bg-neutral-100 tw:dark:hover:bg-dark-gray-300 tw:grid-cols-[1fr_2fr]"><div class="tw:font-medium">IP Address</div><div>' . htmlentities($ip) . '</div></div>'; |
52 | 50 | } |
53 | 51 | } catch (InvalidIpException) { |
54 | 52 | // don't add an ip line |
55 | 53 | } |
56 | 54 | } |
57 | 55 |
|
58 | 56 | if ($device['purpose']) { |
59 | | - echo '<div class="row"> |
60 | | - <div class="col-sm-4">Description</div> |
61 | | - <div class="col-sm-8">' . Clean::html($device['purpose'], []) . '</div> |
| 57 | + echo '<div class="tw:grid tw:items-center tw:gap-2.5 tw:px-2 tw:py-2 tw:hover:bg-neutral-100 tw:dark:hover:bg-dark-gray-300 tw:grid-cols-[1fr_2fr]"> |
| 58 | + <div class="tw:font-medium">Description</div> |
| 59 | + <div>' . Clean::html($device['purpose'], []) . '</div> |
62 | 60 | </div>'; |
63 | 61 | } |
64 | 62 |
|
65 | 63 | if ($device['hardware']) { |
66 | | - echo '<div class="row"> |
67 | | - <div class="col-sm-4">Hardware</div> |
68 | | - <div class="col-sm-8">' . Clean::html($device['hardware'], []) . '</div> |
| 64 | + echo '<div class="tw:grid tw:items-center tw:gap-2.5 tw:px-2 tw:py-2 tw:hover:bg-neutral-100 tw:dark:hover:bg-dark-gray-300 tw:grid-cols-[1fr_2fr]"> |
| 65 | + <div class="tw:font-medium">Hardware</div> |
| 66 | + <div>' . Clean::html($device['hardware'], []) . '</div> |
69 | 67 | </div>'; |
70 | 68 | } |
71 | 69 |
|
72 | | -echo '<div class="row"> |
73 | | - <div class="col-sm-4 text-nowrap">Operating System</div> |
74 | | - <div class="col-sm-8">' . Clean::html($device['os_text'] . ' ' . $device['version'] . ' ' . $device['features'], []) . ' </div> |
| 70 | +echo '<div class="tw:grid tw:items-center tw:gap-2.5 tw:px-2 tw:py-2 tw:hover:bg-neutral-100 tw:dark:hover:bg-dark-gray-300 tw:grid-cols-[1fr_2fr]"> |
| 71 | + <div class="tw:font-medium tw:text-nowrap">Operating System</div> |
| 72 | + <div>' . Clean::html($device['os_text'] . ' ' . $device['version'] . ' ' . $device['features'], []) . ' </div> |
75 | 73 | </div>'; |
76 | 74 |
|
77 | 75 | if ($device['serial']) { |
78 | | - echo '<div class="row"> |
79 | | - <div class="col-sm-4">Serial</div> |
80 | | - <div class="col-sm-8">' . Clean::html($device['serial'], []) . '</div> |
| 76 | + echo '<div class="tw:grid tw:items-center tw:gap-2.5 tw:px-2 tw:py-2 tw:hover:bg-neutral-100 tw:dark:hover:bg-dark-gray-300 tw:grid-cols-[1fr_2fr]"> |
| 77 | + <div class="tw:font-medium">Serial</div> |
| 78 | + <div>' . Clean::html($device['serial'], []) . '</div> |
81 | 79 | </div>'; |
82 | 80 | } |
83 | 81 |
|
84 | 82 | if ($device['sysObjectID']) { |
85 | | - echo '<div class="row"> |
86 | | - <div class="col-sm-4">Object ID</div> |
87 | | - <div class="col-sm-8">' . Clean::html($device['sysObjectID'], []) . '</div> |
| 83 | + echo '<div class="tw:grid tw:items-center tw:gap-2.5 tw:px-2 tw:py-2 tw:hover:bg-neutral-100 tw:dark:hover:bg-dark-gray-300 tw:grid-cols-[1fr_2fr]"> |
| 84 | + <div class="tw:font-medium">Object ID</div> |
| 85 | + <div>' . Clean::html($device['sysObjectID'], []) . '</div> |
88 | 86 | </div>'; |
89 | 87 | } |
90 | 88 |
|
91 | 89 | if ($device['sysContact']) { |
92 | | - echo '<div class="row"> |
93 | | - <div class="col-sm-4">Contact</div>'; |
| 90 | + echo '<div class="tw:grid tw:items-center tw:gap-2.5 tw:px-2 tw:py-2 tw:hover:bg-neutral-100 tw:dark:hover:bg-dark-gray-300 tw:grid-cols-[1fr_2fr]"> |
| 91 | + <div class="tw:font-medium">Contact</div>'; |
94 | 92 |
|
95 | 93 | $contactText = get_dev_attrib($device, 'override_sysContact_bool') |
96 | 94 | ? get_dev_attrib($device, 'override_sysContact_string') |
|
115 | 113 | $displayText ??= Clean::html($contactText); |
116 | 114 |
|
117 | 115 | if (get_dev_attrib($device, 'override_sysContact_bool')) { |
118 | | - echo '<div class="col-sm-8">' . $displayText . '</div> |
| 116 | + echo '<div>' . $displayText . '</div> |
119 | 117 | </div> |
120 | | - <div class="row"> |
121 | | - <div class="col-sm-4">SNMP Contact</div> |
122 | | - <div class="col-sm-8">' . Clean::html($device['sysContact']) . '</div> |
| 118 | + <div class="tw:grid tw:items-center tw:gap-2.5 tw:px-2 tw:py-2 tw:hover:bg-neutral-100 tw:dark:hover:bg-dark-gray-300 tw:grid-cols-[1fr_2fr]"> |
| 119 | + <div class="tw:font-medium">SNMP Contact</div> |
| 120 | + <div>' . Clean::html($device['sysContact']) . '</div> |
123 | 121 | </div>'; |
124 | 122 | } else { |
125 | | - echo '<div class="col-sm-8">' . $displayText . '</div> |
| 123 | + echo '<div>' . $displayText . '</div> |
126 | 124 | </div>'; |
127 | 125 | } |
128 | 126 | } |
129 | 127 |
|
130 | 128 | if (! empty($device['inserted']) && preg_match('/^0/', (string) $device['inserted']) == 0) { |
131 | 129 | $inserted_text = 'Device Added'; |
132 | 130 | $inserted = (Time::formatInterval(-(time() - strtotime((string) $device['inserted'])))); |
133 | | - echo "<div class='row'><div class='col-sm-4'>$inserted_text</div><div class='col-sm-8' title='$inserted_text on " . $device['inserted'] . "'>$inserted</div></div>"; |
| 131 | + echo '<div class="tw:grid tw:items-center tw:gap-2.5 tw:px-2 tw:py-2 tw:hover:bg-neutral-100 tw:dark:hover:bg-dark-gray-300 tw:grid-cols-[1fr_2fr]"><div class="tw:font-medium">' . $inserted_text . "</div><div title='$inserted_text on " . $device['inserted'] . "'>$inserted</div></div>"; |
134 | 132 | } |
135 | 133 |
|
136 | 134 | if (! empty($device['last_discovered'])) { |
137 | 135 | $last_discovered_text = 'Last Discovered'; |
138 | 136 | $last_discovered = (empty($device['last_discovered']) ? 'Never' : Time::formatInterval(-(time() - strtotime((string) $device['last_discovered'])))); |
139 | | - echo "<div class='row'><div class='col-sm-4'>$last_discovered_text</div><div class='col-sm-8' title='$last_discovered_text at " . $device['last_discovered'] . "'>$last_discovered</div></div>"; |
| 137 | + echo '<div class="tw:grid tw:items-center tw:gap-2.5 tw:px-2 tw:py-2 tw:hover:bg-neutral-100 tw:dark:hover:bg-dark-gray-300 tw:grid-cols-[1fr_2fr]"><div class="tw:font-medium">' . $last_discovered_text . "</div><div title='$last_discovered_text at " . $device['last_discovered'] . "'>$last_discovered</div></div>"; |
140 | 138 | } |
141 | 139 |
|
142 | 140 |
|
|
152 | 150 | } |
153 | 151 |
|
154 | 152 | if ($uptime) { |
155 | | - echo "<div class='row'><div class='col-sm-4'>$uptime_text</div><div class='col-sm-8'>$uptime</div></div>"; |
| 153 | + echo '<div class="tw:grid tw:items-center tw:gap-2.5 tw:px-2 tw:py-2 tw:hover:bg-neutral-100 tw:dark:hover:bg-dark-gray-300 tw:grid-cols-[1fr_2fr]"><div class="tw:font-medium">' . $uptime_text . '</div><div>' . $uptime . '</div></div>'; |
156 | 154 | } |
157 | 155 |
|
158 | 156 | if ($device['location_id'] && $location = Location::find($device['location_id'])) { |
|
162 | 160 | $location_coords = $location_valid ? $location->lat . ', ' . $location->lng : 'N/A'; |
163 | 161 |
|
164 | 162 | echo ' |
165 | | - <div class="row"> |
166 | | - <div class="col-sm-4">Location</div> |
167 | | - <div class="col-sm-8">' . Clean::html($location->display(), []) . '</div> |
| 163 | + <div class="tw:grid tw:items-center tw:gap-2.5 tw:px-2 tw:py-2 tw:hover:bg-neutral-100 tw:dark:hover:bg-dark-gray-300 tw:grid-cols-[1fr_2fr]"> |
| 164 | + <div class="tw:font-medium">Location</div> |
| 165 | + <div>' . Clean::html($location->display(), []) . '</div> |
168 | 166 | </div> |
169 | | - <div class="row" id="coordinates-row" data-toggle="collapse" data-target="#toggle-map"> |
170 | | - <div class="col-sm-4">Lat / Lng</div> |
171 | | - <div class="col-sm-8"><span id="coordinates-text">' . $location_coords . '</span><div class="pull-right">'; |
| 167 | + <div class="tw:grid tw:items-center tw:gap-2.5 tw:px-2 tw:py-2 tw:hover:bg-neutral-100 tw:dark:hover:bg-dark-gray-300 tw:grid-cols-[1fr_2fr]" id="coordinates-row" data-toggle="collapse" data-target="#toggle-map"> |
| 168 | + <div class="tw:font-medium">Lat / Lng</div> |
| 169 | + <div class="tw:flex tw:items-center tw:justify-between tw:gap-2"><span id="coordinates-text">' . $location_coords . '</span>'; |
172 | 170 |
|
173 | 171 | echo '<div class="btn-group" role="group" aria-label="Map actions">'; |
174 | 172 | echo '<button type="button" id="toggle-map-button" class="btn btn-primary btn-xs" data-toggle="collapse" data-target="#toggle-map"><i class="fa fa-map" style="color:white" aria-hidden="true"></i> <span>View</span></button>'; |
|
177 | 175 | } |
178 | 176 | echo ' </div> |
179 | 177 | </div> |
180 | | - </div> |
181 | 178 | </div> |
182 | | - <div id="toggle-map" class="row collapse"><div id="location-map"></div></div> |
183 | | - <script> |
| 179 | + <div id="toggle-map" class="collapse"><div id="location-map"></div></div>'; |
| 180 | + echo '<script> |
184 | 181 | var device_map, device_marker_cluster; |
185 | 182 |
|
186 | 183 | L.Control.Fullscreen = L.Control.extend({ |
|
333 | 330 | ?> |
334 | 331 | </div> |
335 | 332 | </div> |
336 | | - </div> |
337 | | -</div> |
0 commit comments