|
189 | 189 | } |
190 | 190 | } |
191 | 191 | } |
| 192 | +} else if ($action == 'menuitems') { |
| 193 | + if (!canEdit('System')) { |
| 194 | + ZM\Warning('Need System permission to edit menu items'); |
| 195 | + } else if (isset($_REQUEST['items'])) { |
| 196 | + require_once('includes/MenuItem.php'); |
| 197 | + $allItems = ZM\MenuItem::find(); |
| 198 | + foreach ($allItems as $item) { |
| 199 | + $id = $item->Id(); |
| 200 | + $enabled = isset($_REQUEST['items'][$id]['Enabled']) ? 1 : 0; |
| 201 | + $label = isset($_REQUEST['items'][$id]['Label']) ? trim($_REQUEST['items'][$id]['Label']) : null; |
| 202 | + $sortOrder = isset($_REQUEST['items'][$id]['SortOrder']) ? intval($_REQUEST['items'][$id]['SortOrder']) : $item->SortOrder(); |
| 203 | + if ($label === '') $label = null; |
| 204 | + |
| 205 | + $iconType = isset($_REQUEST['items'][$id]['IconType']) ? $_REQUEST['items'][$id]['IconType'] : $item->IconType(); |
| 206 | + if (!in_array($iconType, ['material', 'fontawesome', 'image', 'none'])) $iconType = 'material'; |
| 207 | + $icon = isset($_REQUEST['items'][$id]['Icon']) ? trim($_REQUEST['items'][$id]['Icon']) : $item->Icon(); |
| 208 | + if ($icon === '') $icon = null; |
| 209 | + |
| 210 | + // Handle image upload |
| 211 | + if (isset($_FILES['items']['name'][$id]['IconFile']) |
| 212 | + && $_FILES['items']['error'][$id]['IconFile'] == UPLOAD_ERR_OK) { |
| 213 | + $uploadDir = ZM_PATH_WEB.'/graphics/menu/'; |
| 214 | + if (!is_dir($uploadDir)) mkdir($uploadDir, 0755, true); |
| 215 | + |
| 216 | + $tmpName = $_FILES['items']['tmp_name'][$id]['IconFile']; |
| 217 | + $origName = basename($_FILES['items']['name'][$id]['IconFile']); |
| 218 | + $ext = strtolower(pathinfo($origName, PATHINFO_EXTENSION)); |
| 219 | + $allowedExts = ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp', 'ico']; |
| 220 | + if (in_array($ext, $allowedExts)) { |
| 221 | + // Validate it's actually an image (except SVG/ICO) |
| 222 | + if ($ext == 'svg' || $ext == 'ico' || getimagesize($tmpName) !== false) { |
| 223 | + $safeName = 'menu_'.$id.'_'.time().'.'.$ext; |
| 224 | + $destPath = $uploadDir.$safeName; |
| 225 | + if (move_uploaded_file($tmpName, $destPath)) { |
| 226 | + // Remove old uploaded icon if it exists |
| 227 | + if ($item->IconType() == 'image' && $item->Icon() && file_exists(ZM_PATH_WEB.'/'.$item->Icon())) { |
| 228 | + unlink(ZM_PATH_WEB.'/'.$item->Icon()); |
| 229 | + } |
| 230 | + $icon = 'graphics/menu/'.$safeName; |
| 231 | + $iconType = 'image'; |
| 232 | + } |
| 233 | + } |
| 234 | + } |
| 235 | + } |
| 236 | + |
| 237 | + // If user cleared icon, reset to default |
| 238 | + if ($iconType != 'image' && ($icon === null || $icon === '')) { |
| 239 | + $icon = null; |
| 240 | + } |
| 241 | + |
| 242 | + $item->save([ |
| 243 | + 'Enabled' => $enabled, |
| 244 | + 'Label' => $label, |
| 245 | + 'SortOrder' => $sortOrder, |
| 246 | + 'Icon' => $icon, |
| 247 | + 'IconType' => $iconType, |
| 248 | + ]); |
| 249 | + } |
| 250 | + } |
| 251 | + $redirect = '?view=options&tab=menu'; |
| 252 | +} else if ($action == 'resetmenu') { |
| 253 | + if (!canEdit('System')) { |
| 254 | + ZM\Warning('Need System permission to reset menu items'); |
| 255 | + } else { |
| 256 | + // Clean up any uploaded icon files |
| 257 | + require_once('includes/MenuItem.php'); |
| 258 | + $oldItems = ZM\MenuItem::find(); |
| 259 | + foreach ($oldItems as $item) { |
| 260 | + if ($item->IconType() == 'image' && $item->Icon() && file_exists(ZM_PATH_WEB.'/'.$item->Icon())) { |
| 261 | + unlink(ZM_PATH_WEB.'/'.$item->Icon()); |
| 262 | + } |
| 263 | + } |
| 264 | + dbQuery('DELETE FROM Menu_Items'); |
| 265 | + dbQuery("INSERT INTO `Menu_Items` (`MenuKey`, `Enabled`, `SortOrder`) VALUES |
| 266 | + ('Console', 1, 10), |
| 267 | + ('Montage', 1, 20), |
| 268 | + ('MontageReview', 1, 30), |
| 269 | + ('Events', 1, 40), |
| 270 | + ('Options', 1, 50), |
| 271 | + ('Log', 1, 60), |
| 272 | + ('Devices', 1, 70), |
| 273 | + ('IntelGpu', 1, 80), |
| 274 | + ('Groups', 1, 90), |
| 275 | + ('Filters', 1, 100), |
| 276 | + ('Snapshots', 1, 110), |
| 277 | + ('Reports', 1, 120), |
| 278 | + ('ReportEventAudit', 1, 130), |
| 279 | + ('Map', 1, 140)"); |
| 280 | + } |
| 281 | + $redirect = '?view=options&tab=menu'; |
192 | 282 | } // end if object vs action |
193 | 283 | ?> |
0 commit comments